1)分享一道京东的笔试题:
题目描述
小明同学学习了不同的进制之后,拿起了一些数字做起了游戏。小明同学知道,在日常生活中我们最常用的是十进制数,而在计算机中,二进制数也很常用。现在对于一个数字x,小明同学定义出了两个函数f(x)和g(x)。 f(x)表示把x这个数用十进制写出后各个数位上的数字之和。如f(123)=1+2+3=6。 g(x)表示把x这个数用二进制写出后各个数位上的数字之和。如123的二进制表示为1111011,那么,g(123)=1+1+1+1+0+1+1=6。 小明同学发现对于一些正整数x满足f(x)=g(x),他把这种数称为幸运数,现在他想知道,小于等于n的幸运数有多少个?
输入描述:
每组数据输入一个数n(n<=100000)
输出描述:
每组数据输出一行,小于等于n的幸运数个数。
示例1
输入
21
输出
3
思路:挺简单的一道题,中心思想就是对十进制和二进制分别取余数相加,最后判断是否相等。
def fg(x,i):
s = 0
while (x >= 1):
s += x % i
x = int(x/i)
return s
n = int(input())
num = 0
for i in range(1,n+1):
if fg(i,10) == fg(i,2):
num += 1
print (num)
保存取余过程中的各个余数,逆序读出,即可进行任何进制的转换。
参考:牛客网编程题
2)分享美团点评的一道笔试题:
题目描述
现在有一个数组,其值为从1到10000的连续增长的数字。出于某次偶然操作,导致这个数组中丢失了某三个元素,同时顺序被打乱,现在需要你用最快的方法找出丢失的这三个元素,并且将这三个元素根据从小到大重新拼接为一个新数字,计算其除以7的余数。 例:丢失的元素为336,10,8435,得到的新数字为103368435,除以七的余数为2。
输入描述:
输入数据为一行,包含9997个数字,空格隔开。
输出描述:
输出为一行,包含一个数字。
##解法1:排序后找到不连续的点并保存起来即可
n = list(map(int,input().split()))
n.sort()
d = []
x = 0
t = 1
for i in range(1,10001):
if x == 3:
break
t = 1
if (n[i+1]-n[i]>1):
while ((n[i]+t>n[i]) & (n[i]+t<n[i+1])):
d.append(n[i]+t)
t += 1
x += 1
d.sort()
dt = int(str(d[0]) + str(d[1]) + str(d[2]))%7
print (dt)
'''
##解法2:牛客网上看到的别人的解法,思路非常清晰
n = list(map(int,input().split()))
n.sort()
d = []
for i in range(1,10001):
if n[0] == i:
n.pop(0)
else:
d.append(i)
d.sort()
dt = int(str(d[0]) + str(d[1]) + str(d[2]))%7
print (dt)
'''
参考:牛客网编程题
3)
题目描述
有一个X*Y的网格,小团要在此网格上从左上角到右下角,只能走格点且只能向右或向下走。请设计一个算法,计算小团有多少种走法。给定两个正整数int x,int y,请返回小团的走法数目。
输入描述:
输入包括一行,逗号隔开的两个正整数x和y,取值范围[1,10]。
输出描述:
输出包括一行,为走法的数目。
示例1
输入
3 2
输出
10
##逆推,推出每个点往前走有多少中走法,然后递归加起来就行了,注意第一行只能往左走,第一列只能往上走;
def get_way(m,n):
if (m==0)&(n==0):
return 0
if (m==0)&(n!=0):
return 1
if (m!=0)&(n==0):
return 1
if (m!=0)&(n!=0):
return get_way(m-1,n) + get_way(m,n-1)
x,y = map(int,input().split(' '))
s = get_way(x,y)
print (s)
参考:牛客网编程题
(4)提供leetcode上一道简单题:
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
我的解法:
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
single = []
for n in nums:
if n not in single:
single.append(n)
else:
single.remove(n)
return single[0]
能ac通过,但是实际上时间复杂度和空间复杂度并不符合要求。
提供一个很巧妙的解法(用异或的方法):
代码相当简洁:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a = 0
for i in nums:
a ^= i
return a