这里写目录标题
- 1. 字符串相加
- 2. 字符串中的第一个唯一字符
1. 字符串相加
题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
提示:
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
题目链接: https://leetcode.cn/problems/add-strings/submissions/536307291?clienttype=8&version=7.40.0.113&from=win32_yunguanjia&channel=00000000000000000000000040000001&privilege=&pri_extra=
解题思路:
我们想象一下,如果是两个数相加,怎么计算?从个位开始,每位相加,逢十进一。那么字符串也可以按照这样来进行计算,字符也是整形,在ASCII码中数字字符是连续的,所以减去字符零(‘0’)就是对应的数字。下述代码通过两个下标(i和j)分别指向两个字符串的末尾位,然后add变量存储进位值,通过条件运算符来判断该字符串是否结束,结束值为0,每次计算相加本位的两个数字(i和j)和进位值add,把结果接在空字符串ret的末尾,然后下一组。所以只有当两个下标均为-1且进位值为0时,才结束循环。由于是逆序存储,所以要对结果再次逆序操作,使其正序。(讲的不是很好,读者能理解就行,不能理解看看他人的讲解)
代码如下:
// 反转字符串
void reverse(string& s)
{int i = 0, j = s.size() - 1; // 开始和结尾while (i < j){// 交换char tmp = s[j];s[j] = s[i];s[i] = tmp;// 下一组++i;--j;}
}class Solution {
public:string addStrings(string num1, string num2) {// 和加法一样,每位相加int i = num1.size() - 1, j = num2.size() - 1; // 下标,最后一位string ret(""); // 存储相加的结果int add = 0; // 上一位是否有进位while (i >= 0 || j >= 0 || add > 0){// 两数本位取值int n1, n2;n1 = (i >= 0 ? num1[i] - '0' : 0);n2 = (j >= 0 ? num2[j] - '0' : 0);// 本位相加结果int result = n1 + n2 + add;// 存储本位和进位ret += (result % 10 + '0'); // 这里不用强转,char类型进行算数运算都会转换为int类型add = result / 10;// 下一位--i;--j;}// 反转结果字符串reverse(ret);return ret;}
};
2. 字符串中的第一个唯一字符
题目描述:给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
示例 1:
输入: s = “leetcode”
输出: 0
示例 2:
输入: s = “loveleetcode”
输出: 2
示例 3:
输入: s = “aabb”
输出: -1
提示:
1 <= s.length <= 105
s 只包含小写字母
题目链接: https://leetcode.cn/problems/first-unique-character-in-a-string/description/?clienttype=8&version=7.40.0.113&from=win32_yunguanjia&channel=00000000000000000000000040000001&privilege=&pri_extra=
解题思路:
可以看到提示只有26个英文字母,那我们可以是用统计算法。创建一个大小为26的int数组,遍历一遍字符串存储每个字符出现的次数,然后再次遍历字符串,找出第一个唯一字符。可以通过让字符减去字符’a’得到字符在字符数组中的位置。
代码如下:
class Solution {
public:int firstUniqChar(string s) {// 存储26个小写字母出现的次数int times[26] = { 0 };// 遍历字符串存储字符的出现次数int size = s.size();for (int i = 0; i < size; ++i){int n = s[i] - 'a';++times[n];}// 找出第一个出现一次的字符int key = -1;for (int i = 0; i < size; ++i){int n = s[i] - 'a';if (times[n] == 1){key = i;break;}}// 输出return key;}
};