前言
本次这两道题实际上是一道题的正反两个方向,建议读者先看第一题,这样就更好理解第二题,如果想挑战一下,建议直接看第二题。
题目一
解题思路
<1>做题的时候一定看好他给的例子,从A到Z,即1到26,27的时候,变成了AA。
<2>我们类比十进制,从0到9,当9再进一位,变成了10。上述十进制例子中,个位从0到9,那时候十位是0,当9进位,通过十进制概念可知,个位上积累了十次,进一位给十位,个位继续从头累积,所以变成了10。
<3>回到本题,从26进到27时候,多了一位,变成了AA,不正是进位了吗,再联想到10进制,这道题不就是一个26进制运算题吗,只不过是套了一层外壳而已,究其本质,就是26进制和10进制转换问题问题。
代码
class Solution {
public:
int titleToNumber(string columnTitle) {
int ans = 0;
for (int i = 0; i < columnTitle.size(); i++) {
ans *= 26;
ans += columnTitle[i] - 64;
}
return ans;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
时间复杂度:O(N),即遍历一遍给的string
空间复杂度:O(1)。
题目二:
解题思路
通过上一道题可知,这就是一道26进制运算问题,所以由十进制类比运算就行,每次先对26取模,得到当前位,在把当前计算出的值剪掉,在/=26,重复运算直至最后一位。上一道题明显是26进制转10进制,这一道题是10进制转26进制,只需要将上一道题的过程逆过来就行
代码
注:实在不明白我这里写了一个例子分析
class Solution {
public:
string ans = "";//存放倒序结果
string ans_final = "";//因为计算得到的字符串是倒序,所以它存放最终结果
string convertToTitle(int columnNumber) {
if (columnNumber <= 26) {//单独快速处理26以内,即一位数情况
ans += (char)(columnNumber + 64);
return ans;
}
if (columnNumber % 26 == 0) {//经大量尝试发现,凡是columnNumber 是26倍数的,个位必是z,快速处理上
ans += 'Z';
columnNumber -= 26;
}
else {
int tmp = columnNumber - (columnNumber / 26) * 26;//先单独处理个位,原因是个位比较特殊,可以单独处理,别的位无特别情况
ans += (char)(tmp + 64);
columnNumber -= tmp;
}
while (true) {
columnNumber /= 26;//将26进制十位变成个位
if (columnNumber <= 26) {//当<=26说明处理到了最后一位,因为是26进制
ans += (char)(columnNumber + 64);
break;
}
int tmp = columnNumber - (columnNumber / 26) * 26;//取模
ans += (char)(tmp + 64);
columnNumber -= tmp;//将这个求出来的数剪掉,不理解的可以看看上一题,这道题就是上题的逆过程。
}
for (int i = ans.size() - 1; i >= 0; i--) {
ans_final += ans[i];
}
return ans_final;
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):