力扣168. Excel表列名称+171. Excel 表列序号

第六十二天 --- 力扣168. Excel表列名称+171. Excel 表列序号

前言

本次这两道题实际上是一道题的正反两个方向,建议读者先看第一题,这样就更好理解第二题,如果想挑战一下,建议直接看第二题。

题目一

在这里插入图片描述

解题思路

<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;
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JLU_LYM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值