不会跑

work for life

06 Sep 2016

记一个京东技术运营的编程题

昨晚参加了京东2016秋招的技术类笔试,无奈自己编程基础不扎实,昨晚一个编程题弄了45来分钟也没完整解决,今天实习比较闲,所以依据记忆终于解决,但不知是否超时。

题目是:定义一种数由4,7组成,基本规律为:4,7,44,47,74,77,444,447,…然后OJ的输入为:

N
k1
k2
..
k(n)

第一个N表明要输入多少个数,后面N行就是表示求这个序列里第几个数,例如:

4
5
6
7
10

表示一共要输入4个数,然后分别求序列里第5,6,7,10个数,输出要求为:

75
77
444
477

然后我经过观察发现这就是个求这个数处在第几个2的n次方的哪个位置,把最后的位置化为二进制,再替换为4,7输出就好了,下面是基于python2.7的代码,有人可能会说思路这么清晰直接用c,只能说c的字符串处理不熟悉很可能越界,所以直接用python。

  0 #coding:utf-8
  1 import sys
  2 import math
  3 
  4 Line = []
  5 while True:
  6     line = sys.stdin.readline()
  7     if not line:
  8         break
  9     Line.extend(line.split()).
 10 count = int(Line[0])
 11 K = []
 12 for i in xrange(1,count+1):
 13     #首先定位到第几个2的n次方
 14     num = math.log(int(Line[i])+2, 2)
 15     #假设整除直接确定是多少个'7'
 16     if num == int(num):
 17         num = int(num) - 1
 18         K.append('7' * num)
 19     #不整除则减去前2的n-1次方的和,再减1(序号从0开始)
 20     else:
 21         num = int(num)
 22         k = int(Line[i]) - (2 ** num - 2) - 1
 23         j = (bin(k)[2:].replace('0', '4').replace('1', '7'))
 24         #位数不足则补0('4')
 25         if len(j) != num:
 26             j = '4' * (num-len(j)) + j
 27         K.append(j)
 28 for k in K:
 29   print("%s" % k)

最后记录下京东技术运营的部分附加题,就是叫你写一个脚本取出一个web日志里IP的top10,大概日志格式为:

45.53.112.237 /app/jd.apk "2016-07-05" "12:13"

然后我一时手贱,少写了点东西,写成:

#!/bin/bash
cat /var/log/nginx/access.log | cut -d -f 1| sort|uniq -c|head -n 10

是的没错,写过此类脚本的人都发现了我漏掉了些东西,正确的写法应该是:

#!/bin/bash
log=$1
awk '{print $1}' $log| sort |uniq -c | sort -nr | head -n 10

首先是切割的问题,然后就是uniq之后也不是排好逆序的,还得用sort的-nr参数进行数字逆序排列一下,这个脚本很久前写过放在我github上,学的东西很久不用等于没学,这是一个教训,对于京东的笔试,只能看自己运气了,实力只有这么多。

comments powered by Disqus