zoukankan      html  css  js  c++  java
  • leetcode[168] Excel Sheet Column Title

     给定一个数,求出在excel中的列标题。例如 1 对应 A,2 对应 B,. .. , 26对应Z, 27 对应AA

    在没看别人解法之前,我是这样做的:

    观察数学规律,每次求一个字母,假设只有AB的情况的话,应该是这样的:我们列举前面3大种

    A,B,AA,AB,BA,BB,AAA,AAB,ABA,ABB,BAA,BAB,BBA,BBB

    第一种只有一个字母的是两个,如果是26个字母就26个了

    第二中有两个字母,有4个,也就是第一种的平方,如果是26个字母就是26的平方

    第三种有三个字母,有8个,也就是第一种的立方,如果是26个字母就是26的立方

    依次类推。。。

    那么我们可以假设基数为base,基数的次幂power,base的power次幂就记作pow(base,power)

    我们一位一位的判断,判断每一位的时候是对该位可能的数取余,然后在除以前一次的总可能数,根据结果判断给当前位值。

    例如我们举个AAB的例子,AAB对应的数是8,先要求第一位,那就是8对第一种的可能数取余,8%2==0,余数为零的时候我们另外判断,因为余数为零就是都了基数值了,也就是对应字母最后一个,因为我们只假设有两个字母,所以余数为零的时候为B,如果26个字母,那就是Z了。

    接下去求第二位,要减去上一种的可能数2,  8-2==6,6再对当前的可能数取余数  6%4==2,这个时候2对应AB,我们怎么取出我们想要的A呢,只要减去1 再除以2就行了,因为是根据第一个字母A或者B可以把第二种分为两组。减去1再除以2的话就可以把AB分开。

    同理可以求其他位数的。

    代码如下:

    class Solution {
    public:
        string convertToTitle(int n) 
        {
            string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string ans = "";
            int value = n, base = 26, power = 1;
    
            while(value > 0)
            {
                if (value % (int)pow(base, power) == 0)
                    ans = 'Z' + ans;
                else
                    ans = str[(value % (int)pow(base, power) - 1) / (int)pow(base, power - 1)] + ans;
                value -= (int)pow(base, power);
                power++;
            }
            return ans;
        }
    };

    AC了之后想知道别人是不是这样做。发现比我的简单啊。

    其实就是进制问题。我一开始其实差点就有想到的。可是不知怎么的就想到去找数学规律了。

    这位

    • 典型的进制转换,但注意n的开始范围,因为对26取模的范围是0-25,我统一把n–,目的是0-25对应A-Z
    class Solution {
    public:
        string convertToTitle(int n) {
            string res="";
            n--;
            while(n>=0)
            {
                res.insert(0,1,n%26+'A');
                n /= 26;
                n--;
            }
            return res;
        }
    };

    其实可以更简单写成:

    class Solution {
    public:
        string convertToTitle(int n) {
            string res="";
            while(n>0)
            {
                n--;
                res.insert(0,1,n%26+'A');
                n /= 26;
            }
            return res;
        }
    };
  • 相关阅读:
    121.买卖股票 求最大收益1 Best Time to Buy and Sell Stock
    409.求最长回文串的长度 LongestPalindrome
    202.快乐数 Happy Number
    459.(KMP)求字符串是否由模式重复构成 Repeated Substring Pattern
    326.是否为3的平方根 IsPowerOfThree
    231.是否为2的平方根 IsPowerOfTwo
    461.求两个数字转成二进制后的“汉明距离” Hamming Distance
    206.反转单链表 Reverse Linked List
    448. 数组中缺少的元素 Find All Numbers Disappeared in an Array
    常见表单元素处理
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4179283.html
Copyright © 2011-2022 走看看