字符串相关

按照代码随想录写字符串章节,力扣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类型,反向转换不能自动执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值