1.字符串相加
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
思路:从字符串的末尾开始逐位相加,并处理进位。
字符转换为数字 -‘0’ 数字转换为字符+'0'
char digitChar = '3';
int digitInt = digitChar - '0';
std::cout << digitInt << std::endl; // 输出:3
实现:
class Solution {
public:
string addStrings(string num1, string num2) {
int end1=num1.size()-1,end2=num2.size()-1;
string str; //存结果
int next=0;//存储进位
while(end1>=0||end2>=0)//至少有一个字符串还有字符未处理
{
//将num1和num2当前位置的字符转换为数字。
如果某个字符串已经处理完(即索引小于0),则将其值设为0
int x1=end1>=0?num1[end1]-'0':0;
int x2=end2>=0?num2[end2]-'0':0;
//更新进位值next,ret
int ret=x1+x2+next;
next=ret/10;
ret=ret%10;
//将ret转换为字符('0' + ret)并插入到str的开头
str.insert(0,1,'0'+ret);
--end1;//将end1和end2向前移动一位,处理下一个字符
--end2;
}
if(next==1) //如果循环结束后next仍然为1,表示最高位有进位,
需要将这个进位值添加到str的开头
str.insert(0,1,'1');
return str;
}
};
2.仅仅反转字母
描述:
给你一个字符串 s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s
思路:begin从前面找,end从后面开始找,如果找到字母就停下,否则一直往前走,在交换下标begin和end的值。
实现:
class Solution {
public:
//找字母
bool isLetter(char ch)
{
if(ch>='a'&&ch<='z')
return true;
if(ch>='A'&&ch<='Z')
return true;
return false;
}
string reverseOnlyLetters(string s) {
int begin=0,end=s.size()-1;
while(begin<end)
{
while(begin<end&&!isLetter(s[begin]))
{
//如果是不字母就继续
++begin;
}
while(begin<end&&!isLetter(s[end]))
{
//end不是字母就继续 --end
--end;
}
swap(s[begin],s[end]); //下标begin,end都是字母
++begin;
--end;
}
return s;
}
};