LeetCode 344. Reverse String [easy]

本文深入探讨了多种字符串反转方法,包括Python和C++中的for循环、双指针法及类的使用,解析了每种方法的优缺点,并对比了Python与C++在字符串操作上的差异。

一、描述
请编写一个函数,其功能是将输入的字符串反转过来。
输入 hello
输出 olleh

二、思路

(1)for循环
(2)python s[::-1]

三、实现
1、python
之前看了一些其他题目,都是用类写的,尝试用类解决。
https://zhuanlan.zhihu.com/p/36744705解法如下:
(1)

class Solution:
        def reverseString(self, s):
          
            return s[::-1]

如何使用类?

 class Solution:
    def reverseString(self, s):
   
        return s[::-1]
   
rs = Solution()          #()不能少
rs.reverseString('python')        

实用类,加这两句

为什么上面的运行没有结果? 把return改为print就可以了。

(2)自己写的:

class Solution:
    def __init__(self,s):
        print(s[::-1])

rs = Solution('python')

返回 nohtyp

以上两种方法的差异

   class Test:
        def __init__(self):
            print('in init')
        def testfunc(self):
            print('in test func')
    
    te = Test()   # print in init
    te.testfunc() # print in test func
  • (4)for循环

(5)reverse实现
i)

class Solution:
    def reversestring(self,s):
        s = list(s)

        print(s.reverse())
        
rs = Solution()
rs.reversestring('python')

注意:结果是None

没有输出结果的原因:reverse()函数没有返回值
修改为如下:
ii)

class Solution:
    def reversestring(self,s):
        s = list(s)       # 字符串转列表。不能少;reverse只能作用于列表,不能直接作用于字符串
        s.reverse()
        # print('reversed s is ',s)   #  结果:reversed s is  ['n', 'o', 'h', 't', 'y', 'p']
        print(''.join(s))                   # 结果  nohtyp
        
rs = Solution()
rs.reversestring('python')

以上方法都不是本质的方法,(4.26)
双指针法:
思路非常简单
首先定义两个指针 left ,right 开始时分别指向 首元素,末尾元素
交换两个指针指向的元素,两个指针分别向中间移动,直至相遇。

当 left < right 时,

s = input(" Please input a string:")
class reversestring:
    def reversestr(self, s):

        left ,right = 0, len(s) - 1 #
        while left < right:
            # exchange left and right pointer
            s[left],s[right] = s[right],s[left]
            left += 1
            right -= 1 # right += 1
        return s

N = reversestring()
N.reversestr(s)

问题
TypeError: ‘str’ object does not support item assignment
s[left],s[right] = s[right],s[left]
原因是试图改变 字符串元素值

加一个字符串转列表 s = list(s)

2、C++ 实现

(1)for循环
倒着输出字符串

#include <iostream>
#include <string>     // string类,要加头文件。
using namespace std;
int main()
{    
	string str;
	cin >> str;
	for (int i = str.size() - 1; i >= 0; i--)
		cout << str[i];
	return 0;
}

问题:若输入的字符串包含空格,就不能用以上代码。
分析:
题目要求是输入一行字符串,可能包含空格,比如输入:ABC DEF ,用cin的话,只会读取ABC,DEF会舍去,不符合其他测试案例,所以建议使用getline(cin,string),这样可以解决空格问题。
改进:

cin >> str;改为getline(cin,str);

C++ 双指针方法

#include <iostream>
using namespace std;
#include <string>
int main()
{
	string s;
	cin >> s;
	int left = 0, right = s.length() - 1;     //  int left = 0, right = s.length - 1
	while(left < right)
	{
		/*s[left], s[right] = s[right], s[left];
		left += 1;
		right -= 1;*/
		char tmp;
		tmp = s[left];
		s[left] = s[right];
		s[right] = tmp;
		left++;
		right--;
	}

	cout << "反转后的字符串为 " << s << endl; 
	getchar();
	return 0;
}

四、收获
1、python:类的实例化在类名后,类的方法后必须有括号(),即使不传递参数。
2、python for循环

for iterating_var in sequence:
   statements(s)

3、1)C++字符串长度
str.size() 或 str.length() 或 strlen(str)

  1. 字符串定义
    string类:
    C++使用内置的数据类型string来处理字符串会很方便,可以完全代替C语言中的char数组和char指针。
    使用string类需要包含头文件string,string 类型的变量结尾没有“\0”,其本质是一个string类,因此可以通过调用string类中成员函数length()函数。
    string a;//定义一个空字符串。
    string b=“test string”;//定义一个字符串并初始化为test string。

字符数组:
char a[20] = “test string”;

4、C++ cin 遇“空格”、“TAB”、“回车”都结束
改用getline(cin,string);

5、还可以用python的 reverse实现

reverse()函数用于逆序排列 列表中元素。
注意:没有返回值;作用于列表,不是直接作用于字符串。
用法:list.reverse()

5、python中join()使用 https://www.cnblogs.com/jsplyy/p/5634640.html

语法: ‘sep’.join(seq)
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串

返回值:返回以分隔符sep连接各个元素后生成的字符串

五、总结
1、python 的reverse 方法不是本质方法,双指针法是本质的,需要掌握。

添加要改颜色的字体

添加要改颜色的字体

添加要改颜色的字体

添加要改颜色的字体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值