鱼C论坛

 找回密码
 立即注册
查看: 3713|回复: 31

[已解决]Python:每日一题 257

[复制链接]
发表于 2019-10-14 20:41:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2019-10-14 21:29 编辑

今天的题目:


给定一个正整数,返回它在 Excel 表中相对应的列名称

例如,

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

输入: 1
输出: "A"
示例 2:

输入: 28
输出: "AB"
示例 3:

输入: 701
输出: "ZY"


欢迎大家一起答题!
最佳答案
2019-10-15 22:31:53
zltzlt 发表于 2019-10-14 21:33
输入 702 出错。大于 26*26 会是这样的规律:

703 --> AAA

收到,
  1. #返回的字符串长度没有限制,以26进位
  2. list1=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
  3. def func257(num):
  4.     st1=''
  5.     flag=(num-1)//26      #以A-Z为循环     
  6.     while flag:       #判断是否有进位,当有进位时        
  7.         index =flag%26  #进位上的序号
  8.         st1 =list1[index-1] + st1
  9.         flag =(flag-1)//26   #新的进位
  10.     st1 +=list1[num%26-1]
  11.     return st1
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-14 21:01:55 | 显示全部楼层
本帖最后由 lucky邪神 于 2019-10-14 21:26 编辑
  1. list1=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
  2. def func257(num):
  3.     st1=''
  4.     t1=int(num/26)-1      #以A-Z为循环,求出重复次数
  5.     t2=num%26 -1
  6.     #for i in range(t1):
  7.      #   st1 +=list1[i]
  8.     #st1 +=list1[t2]
  9.     if num>26:
  10.         st1 +=list1[t1]
  11.     st1 +=list1[t2]
  12.     return st1
复制代码

我在想如果num大于26^26次,后面会是什么规律呢。~~~自己想多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-14 21:02:57 | 显示全部楼层
  1. class Solution:
  2.     def convertToTitle(self, n: int) -> str:
  3.         string = ''
  4.         while n:
  5.             n -= 1
  6.             x = n % 26
  7.             n //= 26
  8.             string =chr(65 + x) + string
  9.         return string
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-14 21:33:00 | 显示全部楼层
本帖最后由 zltzlt 于 2019-10-15 20:09 编辑
lucky邪神 发表于 2019-10-14 21:01
我在想如果num大于26^26次,后面会是什么规律呢。~~~自己想多了


输入 702 出错。大于 26*26 会是这样的规律:

703 --> AAA
704 --> AAB
705 --> AAC
...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-14 21:33:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-14 21:41:15 | 显示全部楼层
  1. def f(x):
  2.     return chr(x+64) if x<=26 else f((x-1)//26)+f((x-1)%26+1)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-14 22:07:37 | 显示全部楼层
本帖最后由 kaohsing 于 2019-10-14 22:12 编辑
  1. def kao(n):
  2.     col = ''

  3.     while n > 0:
  4.         col =  chr((n - 1) % 26 + 65)+col
  5.         n = int((n - 1) / 26)
  6.     return col


  7. n = 701
  8. print(kao(n))
复制代码



#excel 2013 最大列16384。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-14 22:19:55 | 显示全部楼层
zltzlt 发表于 2019-10-14 21:33
输入 702 出错。大于 26*26 会是这样的规律:

676 --> AAA

如果是在excel,这就不对了,
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-14 22:34:26 | 显示全部楼层
本帖最后由 panheng 于 2019-10-14 22:53 编辑

取个巧~
  1. import openpyxl
  2. def answer(num:int):
  3.     return openpyxl.cell.cell.get_column_letter(num)
复制代码




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-15 00:04:09 | 显示全部楼层
  1. def echo(n):
  2.     res = ""
  3.     while n > 0:
  4.         n -= 1
  5.         res = str(chr(ord('A') + n % 26)) + res
  6.         n //= 26
  7.     return res
  8. print(echo(701))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 03:51:02 | 显示全部楼层
  1. class ExcelTitle:
  2.     def __init__(self):
  3.         self.start = ord('A')
  4.         self.title = list()

  5.     def convert(self, num):        
  6.         while num:
  7.             char = chr(self.start + (num -1) % 26)
  8.             self.title.insert(0, char)
  9.             num = (num-1)//26

  10.         return ''.join(self.title)

  11. if __name__ == '__main__':
  12.     et = ExcelTitle()
  13.     print('{0} : {1}'.format(676, et.convert(676)))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 14:30:16 | 显示全部楼层
  1. def func(n):
  2.     num1 = 0
  3.     count = 1
  4.     str1 = ''
  5.     while True:
  6.         num1 += 26 ** (count)
  7.         if n <= num1:
  8.             if count != 1:
  9.                 for i in range(1,count):
  10.                     n = n - 26 ** (i)
  11.             while count >= 2:
  12.                 str1 += chr(n // 26 ** (count - 1) + 65)
  13.                 n -= (n // 26 ** (count - 1)) * 26 ** (count - 1)
  14.                 count -= 1
  15.             str1 += chr(n + 64)
  16.             return str1
  17.         else:
  18.             count += 1
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 14:55:56 | 显示全部楼层
def solution(n: int) -> str:
        alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
        res = list()
        while n > 0:
            mod = (n % 26)-1
            res.append(alphabet[mod])
            if n == 26:
                break
            n = n//26
            if mod == -1:
                n -= 1
        return ''.join(res[::-1])

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 16:00:19 | 显示全部楼层
本帖最后由 __mrsq__ 于 2019-10-15 20:49 编辑
  1. def fun257(num):
  2.     output = ''
  3.     list_alp = ['Z', 'A', 'B', 'C','D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y']
  4.     while num > 26:
  5.         output = list_alp[num % 26] + output
  6.         if num % 26:
  7.             num //= 26
  8.         else:
  9.             num = num // 26 - 1

  10.     return  list_alp[num%26] + output

  11. print(fun257(703))
复制代码

修改了一下,应该对了。。。没有0这个概念是个坑。。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 16:48:02 | 显示全部楼层
本帖最后由 756437832 于 2019-10-16 05:38 编辑
  1. n=int(input('请输入一个正整数:'))
  2. while n<1:
  3.     n=int(input('请按照要求,输入一个正整数:'))
  4. lsit_res=[]
  5. list_letter=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

  6. def output(list_res):
  7.     str_res=''
  8.     list_res.reverse()
  9.     for each in list_res:
  10.         str_res=str_res+each
  11.     print(str_res)


  12. def getlastletter(n,list_res):
  13.     if n>26:
  14.         list_res.append(list_letter[n%26-1])
  15.         if n>702:
  16.             if n//26<26:
  17.                 list_res.append(list_letter[n//26-1])
  18.                 return output(list_res)
  19.             else:
  20.                 return getlastletter(n//26,list_res)
  21.         else:
  22.             if n//26==27:
  23.                 list_res.append(list_letter[25])
  24.                 return output(list_res)
  25.             list_res.append(list_letter[n//26-1])
  26.             return output(list_res)
  27.     else :
  28.         list_res.append(list_letter[n-1])#1-26之内的情况
  29.         
  30.         output(list_res)
  31.             
  32. getlastletter(n,lsit_res)

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 18:45:30 | 显示全部楼层
本帖最后由 MyWifeDF41 于 2019-10-15 18:47 编辑
  1. def excel(n):
  2.     stringlist = []
  3.     while n > 0:  #相当于搞26进制
  4.         n = n - 1
  5.         a = n % 26
  6.         stringlist.insert(0,chr(a+65))
  7.         n = n // 26
  8.     string = ''
  9.     for b in stringlist:  #倒序相加不太懂,就只能这么搞了
  10.         string = string+b
  11.     return string
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 19:31:43 | 显示全部楼层
本帖最后由 Leify 于 2019-10-15 20:04 编辑

def num_1(w):
    list1 = ['Z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T','U',
             'V', 'W', 'X', 'Y', 'Z']
    m, n =  divmod(w,26)
    print(m, n)
    if w <= 26:
        return list1[n]
    return num_1(m) + list1[n]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-15 20:08:52 | 显示全部楼层
kaohsing 发表于 2019-10-14 22:19
如果是在excel,这就不对了,

真是粗心啊...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-15 22:31:53 | 显示全部楼层    本楼为最佳答案   
zltzlt 发表于 2019-10-14 21:33
输入 702 出错。大于 26*26 会是这样的规律:

703 --> AAA

收到,
  1. #返回的字符串长度没有限制,以26进位
  2. list1=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
  3. def func257(num):
  4.     st1=''
  5.     flag=(num-1)//26      #以A-Z为循环     
  6.     while flag:       #判断是否有进位,当有进位时        
  7.         index =flag%26  #进位上的序号
  8.         st1 =list1[index-1] + st1
  9.         flag =(flag-1)//26   #新的进位
  10.     st1 +=list1[num%26-1]
  11.     return st1
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 20:16:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 14:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表