鱼C论坛

 找回密码
 立即注册
查看: 2677|回复: 7

[作品展示] 昨天晚上师兄应聘招银网络科技的python数据分析题,来个大佬看下。。

[复制链接]
发表于 2017-9-26 17:09:06 | 显示全部楼层 |阅读模式

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

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

x
数据分析题:
有一些数字旋转180度,和旋转前一模一样。
问题:
给定数字的位数(n),找到满足条件的所有数字。
如:
Given n=1,return['0','1','8']
Given n=2,return['11','69','88','96']
来个大佬。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-26 17:33:50 | 显示全部楼层
这题应该挺简单的,先判断位数:
n=1的情况,只可能0,1,8符合条件
n>=2的情况,如果n是偶数,则字符串与倒序字符串进行一一对比,0对应0,1对应1,6对应9,8对应8,9对应6. 如果每个位置都成立,则符合条件,不然就不符合
如果n是奇数,那么最中间位只能是0,1,8,其余位按照n为偶数时同样处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-26 21:40:48 | 显示全部楼层
jerryxjr1220 发表于 2017-9-26 17:33
这题应该挺简单的,先判断位数:
n=1的情况,只可能0,1,8符合条件
n>=2的情况,如果n是偶数,则字符串与 ...

感谢大佬,我昨天审题有问题,我以为旋转一百八十度与对折为同一个概念。。。今天花了点时间,把代码写了出来。。。作为一个新手,代码很渣,望大佬把您的代码贴出来,让我观摩学习下。。。
  1. def zywl(n):
  2.     li=[]
  3.     if  (n % 2) == 0:
  4.         for num in range(10**(n-1)+1,10**(n)):
  5.             string =list(str(num))
  6.             re_string = string[::-1]
  7.             hh=panduan(n,string,re_string)
  8.             if hh==n:
  9.                 #print(num)
  10.                 li.append(num)
  11.             else:
  12.                 pass
  13.     else:
  14.         for num in range(10**(n-1)+1,10**(n)):
  15.             string =list(str(num))
  16.             re_string = string[::-1]
  17.             zjz=(n-1)/2
  18.             if string[zjz]=='6' or string[zjz]=='9':
  19.                 pass
  20.             else:
  21.                 hh=panduan(n,string,re_string)
  22.                 if hh==n:
  23.                     #print(num)
  24.                     li.append(num)
  25.                 else:
  26.                     pass
  27.     return li
  28. def panduan(n,string,re_string):
  29.     hh=0
  30.     for i in range(n):
  31.         if string[i]=='0' and re_string[i]=='0':
  32.             pass
  33.         elif string[i]=='1' and re_string[i]=='1':
  34.             pass
  35.         elif string[i]=='6' and re_string[i]=='9':
  36.             pass
  37.         elif string[i]=='8' and re_string[i]=='8':
  38.             pass
  39.         elif string[i]=='9' and re_string[i]=='6':
  40.             pass
  41.         else:
  42.             break
  43.         hh+=1
  44.     return hh
  45. a= zywl(4)
  46. print a
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-26 23:56:01 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-9-27 10:41 编辑
文明的读书人 发表于 2017-9-26 21:40
感谢大佬,我昨天审题有问题,我以为旋转一百八十度与对折为同一个概念。。。今天花了点时间,把代码写了 ...


凑合看看
  1. def is_rotated(x):
  2.    if len(str(x)) == 1: return True if x in ('0','1','8') else False
  3.    d = {'0':'0', '1':'1', '6':'9', '8':'8', '9':'6'}
  4.    for i in range(len(str(x))//2):
  5.       if str(x)[i] not in d: return False
  6.       if str(x)[::-1][i] not in d: return False
  7.       if d[str(x)[i]] != str(x)[::-1][i]: return False
  8.    if len(str(x)) % 2:
  9.       if str(x)[len(str(x))//2] not in ('0','1','8'): return False
  10.       return True
  11.    return True
  12. def get_rotated(n):
  13.    from itertools import product
  14.    res = set()
  15.    for i in product(('0','1','6','8','9'), repeat=n):
  16.       if i[0] == '0': continue
  17.       if is_rotated(''.join(i)):
  18.          res.add(int(''.join(i)))
  19.    return list(res)
  20. print(get_rotated(5))
复制代码

[96896, 11011, 18181, 80008, 60809, 91016, 98186, 89868, 10001, 19861, 90006, 66199, 88088, 68889, 81818, 99866, 18081, 11811, 98086, 80808, 91816, 10801, 69169, 66099, 86198, 90806, 88888, 61119, 16191, 18881, 99066, 96196, 98886, 60109, 69069, 89168, 86098, 66899, 19161, 61019, 16091, 68189, 81118, 99166, 96096, 90106, 11111, 60009, 80108, 69869, 89068, 91116, 86898, 10101, 19061, 16891, 68089, 81018, 61819, 88188]
[Finished in 0.1s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-27 00:10:10 | 显示全部楼层
文明的读书人 发表于 2017-9-26 21:40
感谢大佬,我昨天审题有问题,我以为旋转一百八十度与对折为同一个概念。。。今天花了点时间,把代码写了 ...

能不用穷举尽量不用穷举,不然效率就很低。能组成翻转的数字一共就(0,1,6,8,9)五个,用排列组合的方法会快得多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-27 10:15:26 | 显示全部楼层
jerryxjr1220 发表于 2017-9-27 00:10
能不用穷举尽量不用穷举,不然效率就很低。能组成翻转的数字一共就(0,1,6,8,9)五个,用排列组合的 ...

嗯呐,多谢大佬,我只想到笨办法,一个一个的数去排除。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 15:39:34 | 显示全部楼层
jerryxjr1220 发表于 2017-9-26 23:56
凑合看看

[96896, 11011, 18181, 80008, 60809, 91016, 98186, 89868, 10001, 19861, 90006, 66199, ...

大佬思路清晰,很厉害!
程序有点小问题。当print(get_rotated(1))的时候第16行会把0这个忽略掉。
个人觉得应该把第2行删除,在14-15中间加1的判断。当大于2的时候才进入for循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 16:03:15 | 显示全部楼层
bush牛 发表于 2017-9-27 15:39
大佬思路清晰,很厉害!
程序有点小问题。当print(get_rotated(1))的时候第16行会把0这个忽略掉。
个人 ...

你说的是对的,没有考虑周全,我只考虑了不能前导0,而当n=1时,是可以0的,只要加1行特殊情况特殊处理即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 21:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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