腾讯2020秋招第二次笔试题

腾讯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)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值