个人主页 : zxctscl
如有转载请先通知

题目

  • 1. 415字符串相加
    • 1.1 分析
    • 1.2 代码
  • 2. 344反转字符串
    • 2.1 分析
    • 2.2 代码
  • 3. HJ1字符串最后一个单词的长度
    • 3.1 分析
    • 3.2 代码
  • 4. 387.字符串中的第一个唯一字符
    • 4.1 分析
    • 4.2 代码
  • 5. 125验证回文串
    • 5.1 分析
    • 5.2 代码

1. 415字符串相加

1.1 分析

要实现字符串的相加,先得定位到两个字符串的最后一个字符:

int end1=num1.size()-1;int end2=num2.size()-1;

如果最后一个字符相加大于10,就得进位

再定义一个变量用来记录进位int next=0;。重新定义一个string的字符串用来记录相加结果string retstr
当两个字符相加,得注意,要转换为整形相加,当ret大于10,那么next=ret/10,而字符穿要记录的是ret=ret%10,再头插retstr.insert(0,1,ret+'0'),头插时要转换为字符头插。
如果9+1,那么返回结果就是0,所以不能忘记少插入进位值,在最后判断一下,再进行头插:

if(next==1) retstr.insert(retstr.begin(),'1');

1.2 代码

class Solution {public:string addStrings(string num1, string num2) { int next=0; string retstr; int end1=num1.size()-1; int end2=num2.size()-1; while(end1>=0||end2>=0) {int val1=end1>=0" />[end1--]-'0':0;int val2=end2>=0?num2[end2--]-'0':0;int ret=val1+val2+next;next=ret/10;ret=ret%10;retstr.insert(0,1,ret+'0'); } if(next==1)retstr.insert(retstr.begin(),'1'); return retstr;}};

2. 344反转字符串

2.1 分析

这里题目要求在原地修改,直接用swap进行交换就可以。如果size是偶数那么刚好全部都交换了,如果是奇数,那么除了区间之间的都要交换。
直接用两个变量,一个从前面开始走int l = 0,一个从后面走int r = n - 1,循环结束条件就是:当l等于r就结束,奇数中间的就不会换,偶数也刚好交换完。

while(l< r){swap(s[l], s[r]);l++; r--;}

2.2 代码

class Solution {public:void reverseString(vector<char>& s) { int n=s.size(); int l = 0; int r = n - 1;while(l< r){swap(s[l], s[r]);l++; r--;}}};

3. HJ1字符串最后一个单词的长度

3.1 分析

这里用getline得到输入的一行单词,要获取最后一个单词的长度,那么就得先找到最后一个单词。
在string中有一个rfind是从后往前找,只需要找到第一个空格位置,在这个位置后面一个位置,那就是最后一个单词开始位置,记录下这个位置size_t pos=str.rfind(' ');
然后用size减去这个位置加1就是最后一个单词的长度str.size()-(pos+1)

3.2 代码

#include using namespace std;int main() {string str;getline(cin,str);size_t pos=str.rfind(' ');cout<<str.size()-(pos+1)<<endl;}// 64 位输出请用 printf("%lld")

4. 387.字符串中的第一个唯一字符

4.1 分析

开一个计数数组,题目只包含小写字母,所以开26个就可以了int count[26]={0};,做一个相对映射,每一个减97。遍历字符串记录出现次数。

for(auto ch:s) {count[ch-'a']++; }

可能会出现出现一次的有多个,要找第一个,就得从前往后遍历一下。
第一个出现次数为1的就返回它的下标,没有就返回-1。

for(int i=0;i<s.size();i++) {if(count[s[i]-'a']==1)return i; } return -1;

4.2 代码

class Solution {public:int firstUniqChar(string s) { int count[26]={0}; for(auto ch:s) {count[ch-'a']++; } for(int i=0;i<s.size();i++) {if(count[s[i]-'a']==1)return i; } return -1;}};

5. 125验证回文串

5.1 分析

这里可能会出现大写和数字,故重新定义一个字符串,用来保存将原字符串中将大写变为小写的新字符串。
介绍要用到的函数isalnum(char c) 是否为字母或者数字;islower(char c) 是否为小写字母
遍历s查找里面的字符,不管是不是小写,一律都转化成小写。

 string s1;for (char ch: s) { if (isalnum(ch)) { s1+=tolower(ch);} }

将转为小写的s1先用s2记录一份,再用reverse()逆置,reverse(s2.begin(),s2.end());
再将逆置后的s2与s1进行compare,如果结果为0就为真。反之则为false。

5.2 代码

class Solution {public:bool isPalindrome(string s) {string s1;for (char ch: s) {if (isalnum(ch)) {s1+=tolower(ch);}}string s2=s1;reverse(s2.begin(),s2.end());if(s1.compare(s2)==0){return true;} return false;}};