个人主页 : 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?num1[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 <iostream>
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;}
};