Q1:整数反转
思路:题目的核心逻辑很好理解,只要将给出的数不断的对10进行取模,然后再整除10即可,难点和易错点主要是在于判断数是否会进行溢出。
这里引入C++中的一个知识点
因为无法正向判断是否溢出,所以要考虑以下情况:
1.当result > INT_MAX/10(整数情况)
2.当result < INT_MIN/10(负数情况)
3.当result = INT_MAX/10(整数情况)
注意,这里还要再判断是够会大于7,大于7同样会溢出,所以还需要加上大于INT_MAX%10
4.当result < INT_MIN/10(负数情况),同理,还需要加上<INT_MIN%10
题解:
class Solution {
public:
int num,result = 0;
int reverse(int x) {
while(x!=0)
{
num = x % 10;
x = x / 10;
//判断第二种和第四种情况
if (result < INT_MIN / 10 || (result == INT_MIN && result < INT_MIN % 10 )) {
return 0;
}
//判断第一种和第三种情况
if (result > INT_MAX / 10 || (result == INT_MAX && result > INT_MAX % 10 )) {
return 0;
}
//不断更新返回结果
result = result*10+num;
}
return result;
}
};
Q2:解密消息
思路:可以尝试构建一个哈希表,将给出的key依次遍历,放在哈希表中,最后根据哈希表和message进行一一对应,修改message后再返回message即可
学到的新知识:
C++11的遍历:
for(auto c :s):基于范围的 for 循环中,c 表示 s中的一个元素,auto 则是让编译器自动推导出 c 的类型,每次循环体中c即可代表当前遍历到s的值,若要进行修改,需要在c的前面加上&
unordered_map<string,string> arr;
具体函数的用法可以参考STL的用法
题解:
class Solution {
public:
string decodeMessage(string key, string message) {
char tmp = 'a';
unordered_map<char, char> arr;
for(char c:key) //循环遍历key,当不为空格并且当前的值未曾在哈希表中存在即可进行赋值
{
if(c !=' '&& !arr.count(c))
{arr[c] = tmp++;}
}
for(char& c :message) //&修改c
{
if(c !=' ')
{c = arr[c];}
}
return message;
}
};