赞
踩
按照代码随想录写字符串章节,力扣344反转字符串不会做,想不到双指针,对于字符数组不会输入输出。
于是打开洛谷练手字符串题目,字符串可以是string类型或char一个字符数组,两种方法求长度的方式不同。
B2119删除单词后缀(简单)看题解做出来的。通过这道题目明白了字符串如何输入输出,如何求长度,且删除后缀的方法。
法一:char数组
char s[100000]; //声明一个char数组,不用初始化,(一直在纠结如何初始化,对于用户输入的char数组,无需初始化)
cin>>s; //直接输入s即可,无需像数组输入一样使用for循环一样输入s[i]
int k=strlen(s); //char数组求长度方法
依次判断后缀,若满足删除后缀,,使用s[k-2]='\0',c++认为char数组表示的字符串以'\0'结尾,即s[k-2],s[k-1]被删除
常规方法删除后缀,s[k-2]=' ';s[k-1]=' ';直接另后缀为空格,c++识别为空
法二:string
string s; //声明一个字符串s
cin>>s; //输入
int k=s.size(); //string字符串求长度,string::size()
删除后缀使用s.erase(pos,len); 从第pos个位置开始删除len个字符 string::erase(pos,len)
法三:STL string类,使用一些函数(新知识)
思路:将字符串s翻转,从第零个位置开始找前两个或前三个是不是re,yl,gni,若是则删除,最后再反转。
reverse(s.begin(),s.end()); //反转整个字符串
reverse(s.begin()+i,s.begin()+k); //反转字符串从下标 i 到下标 k(不包括下标k)
reverse(a,a+n); //反转整个数组
reverse(a+i,a+k); //反转数组从下标 i 到下标 k(不包括下标k)
find(“re",pos)函数,参数1为要查找的子串,参数2为开始查找的位置,返回首次查找到子串的位置
做完这道题后,在vs中成功写出力扣344,之前虽然看了讲解能通过力扣,但不懂输入输出无法在vs编译通过。
344反转字符串
原地反转,使用双指针,第一个和最后一个交换,第二个和倒数第二个交换,直到中间(若四个元素,4/2=2,a[0],a[3]交换,a[1],a[2]交换,若5个元素,5/2=2,a[0],a[4]交换,a[1],a[3]交换,a[2]不变,故终止条件为i=size/2)
法一:双指针
vector<char>& s,,不太懂,题目说是字符数组s,故应该用strlen(s)求大小,但此处似乎将s视为string类,用size()求大小。该函数中不用return,不用cout
vs实现,将 vector<char>& s改为char s[]字符数组格式
法二:reverse函数
同样将s看为string字符串,用s.begin(),s.end(),反转字符串
vs实现,将 vector<char>& s改为char s[]字符数组格式,reverse函数反转数组。
541反转字符串2(简单),完全没思路呀!
每2k个为一组,反转前k个,i++改为i+=2k,可解决每2k为一组1-2k-1,2k-4k-1,4k-...最后一组若>k个,反转前k个,若<k个,反转该组所有。
每组从i到i+k反转,i从0到s.size()-1;若i+j>s.size(),反转i到s.size()-1;否则反转i到i+j
方法一:调用reverse函数,s.begin()+i为反转起点,+i+k为终点,i从0开始的原因是:abcdefg s.begin()起点为a,故i起点为0,k=2,i+k=2,为c;反转ab,而reverse函数反转到第二个参数-1的位置。
方法二:自定义reverse1函数
reverse1是交换i和j而不是i和j-1,,while循环i<j时(1234)进行,i==j==3时(12345)反转停止
剑指offer05,替换空格(完全想不到)
方法一:双指针法。一个空格为1位,修改为%20为3位,先修改字符串长度为修改后的长度,每个空格加两位,从后往前若该位指针 i 是空格则 j 指针依次修改为0,2,%,j 指针前移两位;若该位指针 i 不是空格,则 j 指针所指和 i 指针相同。一轮完后两个指针都前移一位。
resize(num)函数,重新定义字符串大小为num值。
方法二:新字符串。声明一个新字符串,遍历原字符串每一位,若该位为空格,新字符串+”%20“,若该位不是空格,新字符串+该位字符。 第一次知道字符串赋值方式可以用str+="%20"。
1.字符串和字符数组的区别
字符串和字符数组都通过char关键字定义。char *p="hh"字符串,有3个字符,加\0; char q[ ]="ww"字符数组,有2个字符。
区别:1.字符串 长度为字符数目+1(包括\0)字符数组 长度=字符数目。strlen输出忽略结束符\0.
2.字符串指针方式char *p="www";可以写成char *p; p="www";可以对指针变量直接赋值。。字符数组char a[ ]="www";不能单独赋值,必须在声明时赋值。
3.字符串指针变量用于存放字符串首地址,字符串存放在以首地址为首的一块连续的内存空间中。字符数组由若干数组元素组成,可以存放整个字符串。
单引号括起来的是字符,字符数组和字符串可以看作存储字符的数组
字符数组和字符串求长度用strlen函数,返回都是5,不考虑字符串中\0的位。
c++提供两种字符串表示方法:c风格字符串和string类类型。
c风格字符串,通过char *类型指针操纵它,char *st="www"; while(*st++) {...}使用指针来遍历c风格字符串。
string str类型的字符串,可以直接以str[ ]数组输出,通过下标访问字符串的每一个字符。可以直接+使得两个字符串拼接,直接+=,可以把c风格字符串转换成string类型,反向转换不能自动执行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。