笔试题分享

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Flying_sfeng/article/details/79817041

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

完整链接附上:https://leetcode.com/articles/single-number/#

猜你喜欢

转载自blog.csdn.net/Flying_sfeng/article/details/79817041