2018腾讯笔试题
Posted clamp7724
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018腾讯笔试题相关的知识,希望对你有一定的参考价值。
1.小Q定义了一种数列称为翻转数列:
给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为‘-‘;。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。
import java.util.Scanner; public class Main public static void main(String[] args) Scanner s = new Scanner(System.in); int n = s.nextInt(); int m = s.nextInt(); Long sum = 0L; int flag = 1; for(int i = 1; i <= n; i++) if(flag <= m) sum = sum - (int)i; else if(flag > m && flag <= 2*m) sum = sum + (int)i; if(flag == 2*m) flag = 0; flag = flag + 1; System.out.println(sum); 过了90%的case,数字过大会超时=。= 看别人的正确答案都是直接算 m*n/2;这原来是数学题么!
2.牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。
牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。
他们的得分等于他们抽到的纸牌数字总和。
现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。
import java.util.*; public class Main public static void main(String[] args) Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int a[] = new int[n]; for(int i = 0; i < n; i++) a[i] = sc.nextInt(); Arrays.sort(a); Long sum = 0L; int jishu = 0; for(int i = n-1; i >= 0; i--) if(jishu == 0) sum = sum + (int)a[i]; jishu = -1; else sum = sum - (int)a[i]; jishu = 0; System.out.println(sum);
3.小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力
import java.util.Scanner; public class Main //算第一天吃f块时,吃n天需要总量是多少。 public static int minCho(int f, int n) int minCho = 0; for(int i = 0; i < n; i++) if(f >= 2) minCho = minCho + f; if(f%2 == 0) f=f/2; else f=f/2 + 1; else minCho = minCho + 1; return minCho; public static void main(String[] args) Scanner s = new Scanner(System.in); int n = s.nextInt(); int m = s.nextInt(); int i = m; for(; i >= 1; i--) if(minCho(i, n) <= m) break; System.out.println(i);
4.小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。
首先一个数学知识:C(m,n)=m!/[(m-n)!n!]
- -虽然做出来了不过只能过40%的case。。。数字有点大。
抄了一份别人的
import java.util.*; public class Main public static final int ASD = 1000000007; public static void main(String[] args) Scanner sc = new Scanner(System.in); int k=sc.nextInt(); int a=sc.nextInt(), x=sc.nextInt(); int b=sc.nextInt(), y=sc.nextInt(); int[] dp = new int[k+1]; dp[0] = 1; for(int i=0; i<x ; i++) for(int j=k; j>=a; j--) dp[j] = (dp[j] + dp[j-a]) % ASD; for(int i=0; i<y ; i++) for(int j=k; j>=b; j--) dp[j] = (dp[j] + dp[j-b]) % ASD; System.out.println(dp[k]); sc.close();
采用了背包问题的解决思路。
之前没接触过,专门研究一下;
以上是关于2018腾讯笔试题的主要内容,如果未能解决你的问题,请参考以下文章