C++第一次练习
题目1
class Solution {
public:
bool isletter(char s)
{
if(s<='z'&&s>='a')
return true;
if(s>='A'&&s<='Z')
return true;
return false;
}
string reverseOnlyLetters(string s) {
if(s.empty())
{
return s;
}
int left,right;
left=0;
right=s.size()-1;
while(left<right)
{
while(left<right&&!isletter(s[left]))
{
left++;
}
while(left<right&&!isletter(s[right]))
{
right--;
}
swap(s[left++],s[right--]);
}
return s;
}
};
首先要判断是不是字母,因为题目说的是只动字母,然后还要判断s是不是空的,因为空的就不需要操作了,接着是要left和right去得到俩头的字符,这里循环里面也有left<right是因为如果没有一个字母[left]就越界了,如果不是字母就走一位,直到left和right都遇到了字母,就执行swap交换俩个字母,换完位置后还要改变left和right,不然就死循环了,一直交换这俩个字母。
题目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;
}
};
先创建一个数组然后通过ch-‘a’可以得到相对位置,出现一次相对位置就会加1,s[i]-'a'可以获取对应位置的索引,判断这个字符串在count对应位置出现的次数是否为1,就可以找到第一个出现的字符
题目3
class Solution {
public:
string addStrings(string num1, string num2) {
string str;
int end1=num1.size()-1;
int end2=num2.size()-1;
int next=0;
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;
str.insert(str.begin(),'0'+ret);
}
if(next==1)
{
str.insert(str.begin(),'1');
}
return str;
}
};
要字符串相加可以先把字符变成数字 ,end1和end2表示字符长度,while循环的条件是俩个字符都遍历完,val1是对应的索引值,如果end1是>=0的情况下,字符遍历完就一直为0,next是俩个数字相加可能会进位,所以和数除十可以得到十位数字,ret%10是为了得到个位的数字,str.insert()是头插函数,第一个参数是从那里开始插入,第二个参数是插入什么进去,最后判断next是否为1是可能最前面的俩个相加大于10,当end1和end2都不满足循环条件了,当next的1是要放在最前面的,