腾讯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项和为多少。

输入描述:

输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。

输出描述:

输出一个整数, 表示前n项和。

输入例子1:

8 2

输出例子1:

8

例子说明1:


2、牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。

牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。

他们的得分等于他们抽到的纸牌数字总和。

现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。

输入描述:

输入包括两行。

第一行包括一个正整数n(1 <= n <= 105),表示纸牌的数量。

第二行包括n个正整数ai(1 <= ai <= 109),表示每张纸牌上的数字。

输出描述:

输出一个整数, 表示游戏结束后牛牛得分减去羊羊得分等于多少。

输入例子1:

3

2 7 4

输出例子1:

5

例子说明1:

3、小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力

输入描述:

每个输入包含一个测试用例。

每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。

输出描述:

输出一个数表示小Q第一天最多能吃多少块巧克力。

输入例子1:

3 7

输出例子1:

4

例子说明1:

4、小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。

输入描述:

每个输入包含一个测试用例。

每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。

接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。

输出描述:

输出一个整数,表示组成歌单的方法取模。因为答案可能会很大,输出对1000000007取模的结果。

输入例子1:

5

2 3 3 3

输出例子1:

9

例子说明1:

5、小Q的公司最近接到m个任务, 第i个任务需要xi的时间去完成, 难度等级为yi。

小Q拥有n台机器, 每台机器最长工作时间zi, 机器等级wi。

对于一个任务,它只能交由一台机器来完成, 如果安排给它的机器的最长工作时间小于任务需要的时间, 则不能完成,如果完成这个任务将获得200 * xi + 3 * yi收益。

对于一台机器,它一天只能完成一个任务, 如果它的机器等级小于安排给它的任务难度等级, 则不能完成。

小Q想在今天尽可能的去完成任务, 即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。

输入描述:

输入包括N + M + 1行,

输入的第一行为两个正整数n和m(1 <= n, m <= 100000), 表示机器的数量和任务的数量。

接下来n行,每行两个整数zi和wi(0 < zi < 1000, 0 <= wi <= 100), 表示每台机器的最大工作时间和机器等级。

接下来的m行,每行两个整数xi和yi(0 < xi < 1000, 0 <= yi<= 100), 表示每个任务需要的完成时间和任务的难度等级。

输出描述:

输出两个整数, 分别表示最大能完成的任务数量和获取的收益。

输入例子1:

1 2

100 3

100 2

100 1

输出例子1:

1 20006

例子说明1:

6、画家小Q又开始他的艺术创作。小Q拿出了一块有NxM像素格的画板, 画板初始状态是空白的,用'X'表示。

小Q有他独特的绘画技巧,每次小Q会选择一条斜线, 如果斜线的方向形如'/',即斜率为1,小Q会选择这条斜线中的一段格子,都涂画为蓝色,用'B'表示;如果对角线的方向形如'\',即斜率为-1,小Q会选择这条斜线中的一段格子,都涂画为黄色,用'Y'表示。

如果一个格子既被蓝色涂画过又被黄色涂画过,那么这个格子就会变成绿色,用'G'表示。

小Q已经有想画出的作品的样子, 请你帮他计算一下他最少需要多少次操作完成这幅画。

输入描述:

每个输入包含一个测试用例。

每个测试用例的第一行包含两个正整数N和M(1 <= N, M <= 50), 表示画板的长宽。

接下来的N行包含N个长度为M的字符串, 其中包含字符'B','Y','G','X',分别表示蓝色,黄色,绿色,空白。整个表示小Q要完成的作品。

输出描述:

输出一个正整数, 表示小Q最少需要多少次操作完成绘画。

输入例子1:

4 4

YXXB

XYGX

XBYY

BXXY

输出例子1:

3

例子说明1:

XXXX

XXXX

XXXX

XXXX

->

YXXX

XYXX

XXYX

XXXY

->

YXXB

XYBX

XBYX

BXXY

->

YXXB

XYGX

XBYY

BXXY

参考答案

1、

n,m=map(int,raw_input().strip().split(' '))
res=n/2
res*=m
print res


2、

n=int(raw_input())
a=map(int,raw_input().strip().split(' '))
a.sort()
score_f=0
fori inrange(len(a)-1,-1,-2):
   score_f+=a[i]
res=score_f-(sum(a)-score_f)
printres


3、

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
   public static Set set = new HashSet();
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       while (sc.hasNext()) {
           long days = sc.nextLong();
           long value = sc.nextLong();
           long left = 0;
           long right = value;
           while (left < right) {
               long mid = (right - left) / 2 + left;
               int temp = isValid(mid, days, value);
               if (temp < 0) {
                   right = mid - 1;
               } else if (temp > 0) {
                   left = mid + 1;
               } else {
                   break;
               }
           }
           long res = (right - left) / 2 + left;
           if (isValid(res, days, value) < 0) {
               System.out.println(res - 1);
           } else {
               System.out.println(res);
           }
       }
       sc.close();
   }
   public static int isValid(long start, long days, long value) {
       if (set.contains(start)) {
           return -1;
       }
       long temp = 0;
       for (int i = 0; i < days; i++) {
           temp += start;
           if (temp > value) {
               set.add(start);
               return -1;
           }
           start = (long) Math.ceil((double) (start / 2.0));
       }
       return temp < value ? 1 : 0;
   }
}


4、

K=int(raw_input())
a,na,b,nb=map(int,raw_input().strip().split(' '))
arr=[a for i in range(na)]
brr=[b for j in range(nb)]
M=1000000007
def get_value(n):  
   if n==1:  
       return n  
   else:  
       return n * get_value(n-1)  
def gen_last_value(n,m):  
   first = get_value(n)  
     
   second = get_value(m)  
     
   third = get_value((n-m)) if n!=m else 1  
     
   return first/(second * third) if n!=m else 1
ans=0
for i in range(na+1):
   for j in range(nb+1):
       
       if a*i+b*j==K:
           if i!=0 and j!=0:
               ans+=gen_last_value(na,i)*gen_last_value(nb,j)
           elif i==0 and j==0:
               ans+=0
           else:
               ans+=gen_last_value(na,i) if i!=0 else gen_last_value(nb,j)
print int(ans%M)  

5、

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
   static class Pair {
       int time;
       int diff;

       public Pair(int time, int diff) {
           this.time = time;
           this.diff = diff;
       }
   }

   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       while (sc.hasNext()) {
           int machineNum = sc.nextInt();
           int taskNum = sc.nextInt();
           Pair[] machines = new Pair[machineNum];
           Pair[] tasks = new Pair[taskNum];
           for (int i = 0; i < machineNum; i++) {
               machines[i] = new Pair(sc.nextInt(), sc.nextInt());
           }
           for (int i = 0; i < taskNum; i++) {
               tasks[i] = new Pair(sc.nextInt(), sc.nextInt());
           }
           Comparator<Pair> cmp = new Comparator<Pair>() {

               <a href="/profile/992988" data-card-uid="992988" class="js-nc-card" target="_blank" style="color: #25bb9b">@Override
               public int compare(Pair p1, Pair p2) {
                   if (p1.time == p2.time) {
                       return p2.diff - p1.diff;
                   } else {
                       return p2.time - p1.time;
                   }
               }
           };
           Arrays.sort(machines, cmp);
           Arrays.sort(tasks, cmp);
           long sum = 0;
           int count = 0;
           int j = 0;
           int[] dp = new int[101];
           for (int i = 0; i < taskNum; i++) {
               while (j < machineNum && machines[j].time >= tasks[i].time) {
                   dp[machines[j].diff]++;
                   j++;
               }
               for (int k = tasks[i].diff; k < 101; k++) {
                   if (dp[k] != 0) {
                       dp[k]--;
                       sum += 200 * tasks[i].time + 3 * tasks[i].diff;
                       count++;
                       break;
                   }
               }
           }
           System.out.println(count + " " + sum);
       }
       sc.close();
   }
}

6、

import java.util.Arrays;
import java.util.Scanner;

public class DrawerQ {
   public static int count = 0;
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       while (sc.hasNext()) {
           int n = sc.nextInt();
           int m = sc.nextInt();
           char[][] chs = new char[n][m];
           char[][] temp = new char[n][m];
           for (int i = 0; i < n; i++) {
               String s = sc.next();
               for (int j = 0; j < m; j++) {
                   chs[i][j] = s.charAt(j);
               }
               Arrays.fill(temp[i], 'X');
           }
           for (int i = 0; i < n; i++) {
               for (int j = 0; j < m; j++) {
                   if (chs[i][j] != temp[i][j]) {
                       if (chs[i][j] == 'Y' || (chs[i][j] == 'G' && temp[i][j] == 'B')) {
                           right(temp, chs, i, j);
                           count ++;
                       }else if (chs[i][j] == 'B' || (chs[i][j] == 'G' && temp[i][j] == 'Y')) {
                           left(temp, chs, i, j);
                           count ++;
                       }else if(chs[i][j] == 'G') {
                           right(temp, chs, i, j);
                           left(temp, chs, i, j);
                           count += 2;
                       }
                   }
               }
           }
           System.out.println(count);
       }
       sc.close();
   }

   public static void right(char[][] temp, char[][] chs, int i, int j) {
       while(i >= 0 && i < temp.length && j >= 0 && j < temp[0].length) {
           if (chs[i][j] == 'Y' && temp[i][j] == 'X') {
               temp[i][j] = 'Y';
           } else if (chs[i][j] == 'G') {
               if(temp[i][j] == 'B') {
                   temp[i][j] = 'G';
               }else if(temp[i][j] == 'X') {
                   temp[i][j] = 'Y';
               }
           } else {
               break;
           }
           i ++;
           j ++;
       }
   }

   public static void left(char[][] temp, char[][] chs, int i, int j) {
       while(i >= 0 && i < temp.length && j >= 0 && j < temp[0].length) {
           if (chs[i][j] == 'B' && temp[i][j] == 'X') {
               temp[i][j] = 'B';
           } else if (chs[i][j] == 'G') {
               if(temp[i][j] == 'Y') {
                   temp[i][j] = 'G';
               }else if(temp[i][j] == 'X'){
                   temp[i][j] = 'B';
               }
           } else {
               break;
           }
           i ++;
           j --;
       }
   }
}




个人资料
crazybean
等级:8
文章:61篇
访问:15.7w
排名: 5
上一篇: 2018阿里软件工程师笔试题
下一篇:百度2018秋招客户端试题
猜你感兴趣的圈子:
腾讯笔试面试圈
标签: temp、chs、sc、pair、纸牌、面试题
隐藏