LeetCode 168. Excel Sheet Column Title && LeetCode 171. Excel Sheet Column Number

171. Excel Sheet Column Number

题目:

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:

    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 
    ...

Example 1:

Input: "A"
Output: 1

Example 2:

Input: "AB"
Output: 28

Example 3:

Input: "ZY"
Output: 701

为什么先在这儿放171然后才放168呢,因为171我秒做但是168我到现在还没完全理解,真令人头大。这两道题其实可以看做十进制和二十六进制之间的转换,只是这个二十六进制不像普通的二进制十六进制一样有0,但其实也可以把A看作0,Z看作25,Emmm,这个后面再说。

171这道题其实就是二十六进制转十进制,写几个样例出来就会发现,A代表1,Z代表26,然后就可以按照进制的做法,当前位的数字乘上26的位数次方,截个discussion上的图来就一目了然了。

于是,代码很快就写出来了。后来在discussion里见到直接把上一次的结果*26以后再加上当前位数的,觉得很机制,就也加在注释里了。

代码如下,时间4ms,91.97%,空间8.5M,5.04%:

/*
 * @lc app=leetcode id=171 lang=cpp
 *
 * [171] Excel Sheet Column Number
 */
class Solution {
public:
    int titleToNumber(string s) {
        int size = s.size();
        int result = 0;
        for (int i = size - 1; i >= 0; i--) {
            result += (s[i] - 'A' + 1) * pow(26, size - i - 1);
            //result = result * 26 + (s[i] - 'A' + 1)
        }
        return result;
    }
};


 

168. Excel Sheet Column Title

题目

Given a positive integer, return its corresponding column title as appear in an Excel sheet.

For example:

    1 -> A
    2 -> B
    3 -> C
    ...
    26 -> Z
    27 -> AA
    28 -> AB 
    ...

Example 1:

Input: 1
Output: "A"

Example 2:

Input: 28
Output: "AB"

Example 3:

Input: 701
Output: "ZY"

好的,下面来到了168,十进制转二十六进制:)前面提到过了,这里没有0,但是有26,于是,就要在采用长除法求进制的基础之上再进行改造,针对余数为0的情况进行特殊的处理。先来介绍一下长除法吧,我都忘了怎么求了,还是上网搜出来的。

长除法的原理就是,把待求的数字n除以进制数,每一次除法取余数作为从右往左的位数,并取商作为下一次的被除数。

回到本题的特殊二十六进制的情况,当求出来的余数不为0的时候,直接快乐地加一位'A'+ r - 1就好,但当求出来的余数为0的时候就要小心了,往result里面加的字母应该是'Z'没错,但是我就是想不通接下来要对这个被除数做什么特殊处理。看了discussion才知道需要再把被除数-26,我的感觉上应该是这个意思,不确定对不对,就是要把'Z'代表的26从总数中减掉,因为如果是普通的带余数的话,其实在整除的时候已经悄咪咪地把余数给剔除了,而如果是余0就不做操作,也就是现在余26的话就要减掉26?

于是这种想法的代码如下,时间0ms,100%,空间8.3M,5.08%:

class Solution {
public:
    string convertToTitle(int n) {
        string result = "";

        while (n != 0) {
            int remainder = n % 26;
            cout << n << " " << remainder << " ";
            if (remainder == 0) {
                result = 'Z' + result;
                //n -= 26;
            }
            else {
                result = char('A' + remainder - 1) + result;
            }
            n = n / 26;
        }
        
        return result;
    }
};

另外一种做法就是简单地把A当作0,Z当作25,整体向前挪一位,思路倒是很清晰,但是写起代码来也是让我很困惑。余数那里-1我可以理解,但是最后为什么还要在整除的时候-1呢?

有一位老哥举了个例子,52 = AZ = (A' + 1) * 26 + (Z' + 1) * 1.

如果要求Z',它就是(52 - 1) % 26 = 25,即(n - 1) % 26;而如果要求A',如果直接n /= 26,那A'就变成了2(小哥说的Z' + 1 will give additional 1我没咋看懂orz),所以要先-1?

姑且先这么理解吧,这种方法的代码如下,时间4ms,84.67%,空间8.3M,5.08%:

class Solution {
public:
    string convertToTitle(int n) {
        string result = "";

        while (n != 0) {
            int remainder = (n - 1) % 26;
            result = char(remainder + 'A') + result;
            n = (n - 1) / 26;
        }
        
        return result;
    }
};

另外还看到了递归的骚操作,一行就搞定了,真的是很骚了,直接贴链接吧:https://leetcode.com/problems/excel-sheet-column-title/discuss/51398/My-1-lines-code-in-Java-C%2B%2B-and-Python

小小一道数学题折磨了我两小时,流下了数学不好的泪水。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值