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;
}
};
3.验证一个字符串是否是回文
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串
s
,如果它是 回文串 ,返回true
;否则,返回false
。
思路:先小写转换为大写
class Solution {
public:
bool isLetterOrNumber(char ch)
{
return(ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
}
bool isPalindrome(string s)
{
for (auto& ch : s)
{
if (ch >= 'a' && ch <= 'z')
ch -= 32;
}
int begin = 0, end = s.size() - 1;
while (begin < end)
{
while (begin < end && !isLetterOrNumber(s[begin]))
++begin;
while (begin < end && !isLetterOrNumber(s[end]))
--end;
if (s[begin] != s[end])
return false;
else
{
++begin;
--end;
}
}
return true;
}
};