腾讯2020秋招第二次面试
1、n个上锁宝箱,m串钥匙;每个宝箱只能被打开一次,钥匙只能用一次
每个宝箱上标有ai,每串钥匙上标有bj,只有当ai+bj = 奇数时,才能打开宝箱
求最多能打开多少个宝箱
输入:
- n,m
- a1,a2,an n个宝箱标识
- b1,b2,bm m个钥匙标识
思路:
- 只有奇数+偶数 = 奇数
- 分别找到ai、bi中的奇数和偶数个数 aOdd 、aEven、bOdd、bEven
- min(aOdd,bEven) + min(aEven,bOdd)
#coding=utf-8
import sys
def maxNum(arr):
#先对数据进行处理
n = arr[0][0]
m = arr[0][1]
a = arr[1]
b = arr[2]
#计算a,b中奇数和偶数的个数
aEven = isEven(a)
aOdd = len(a) - aEven
aEven = isEven(a)
aOdd = len(a) - aEven
#min(aEven, bOdd) 代表能a偶数+b奇数 = 奇数的最大数
#min(aOdd, bEven) 代表a奇数+b偶数 = 奇数 的最大数
return min(aEven, bOdd)+min(aOdd, bEven);
#判断一个数组中偶数的个数
def isEven(arr) {
count = 0
for i in arr:
if(i % 2 == 0):
count += 1
return count
}
if __name__ == "__main__":
# 读取第一行的n
n = 3
ans = []
for i in range(n):
# 读取每一行
line = sys.stdin.readline().strip()
# 把每一行的数字分隔后转化成int列表
values = map(int, line.split())
ans.append(values)
print maxNum(ans)
2、判断二月有多少天
思路:判断闰年和平年,闰年28天,平年29天
闰年能被4整除,不能被100整除或者能被400整除
process.stdin.on('data', (data) => {
buff.push(data)
});
process.stdin.once('end', () => {
const input = Buffer.concat(buff).toString('UTF-8');
const res = howManyDaysAreThereInFebruary(input);
console.log(res);
});
function howManyDaysAreThereInFebruary(year) {
var flag = 0;
if((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0){
flag = 1;
}
return flag ? 28 : 29
}
3、输入多维数组,输出一维数组
思路:判断子项是不是为数组,是的则重新调用isArray函数,
function flatten(arr) {
var result = [];
result = isArray(arr,result)
return result
}
function isArray(arr,result) {
arr.forEach(ar => {
if(ar instanceOf Array) {
result = isArray(ar, result)
} else {
result.append(ar)
}
})
}
4、最小化不满意度
题目:n表示排队人数,每个人i都有两个参数[ai,bi];排在第j位置的人的不满意度计算为notS = ai*(j-1) + bi*(n-j)
要求,店长为了每个顾客的满意度,调整排队位置(j是变量),来达到最小化不满意度
思路:
- notS = ai(j-1) + bi(n-j) = j(ai-bi) + nbi - ai
- nbi - ai跟顾客的位置没有关系,所以是个常量
- j(ai-bi) 可知道 ci = (ai-bi)可以计算出来,j是顾客的位置
- ci数组来存取每个人的ai-bi,对其进行升序排列,所以此时要想得到最小值,则ci最小值乘以位置j最大值,依次计算
#coding=utf-8
import sys
def minNotSatisfy(n,a,b):
c = []
total = 0
for i in range(n):
c[i] = a[i] - b[i]
total += (n*b[i] - a[i])
c.sort() #对c数组进行升序排列
for j in range(n):
total += c[n-j-1]*(j+1)
#total += c[j]*(n-j)
return total
if __name__ = "__main__":
#读取第一行
n = int(sys.stdin.readline.strip())
ans = []
a = []
b = []
for i in range(n):
#读取每一行
line = sys.stdin.readline().strip()
# 把每一行的数字分隔后转化成int列表
values = map(int, line.split())
ans.append(values)
a.append(values[0])
b.append(values[1])
print minNotSatisfy(n,a,b)