2017网易秋招编程集合

CPP

http://blog.csdn.net/achiberx/article/details/74058208

[编程题]回文序列

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, 
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。

输入描述:

输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50)
第二行为序列中的n个整数item[i]  (1 ≤ iteam[i] ≤ 1000),以空格分隔。

输出描述:

输出一个数,表示最少需要的转换次数

输入例子:

4
1 1 1 3

输出例子:

2

解题思路:

将该序列左右两端同时开始向中间合并。无论怎么样最终会变成一个数字,也只是最坏的一种情况。

源代码:

[java] view plain copy

  1. import java.util.Scanner;
  2. /**
  3. *
  4. * @author 慕一春
  5. * @version 1.0.0
  6. * @filename Main.java
  7. * @time 2016-9-21 下午2:50:56
  8. * @copyright(C) 2016
  9. */
  10. public class Main {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. int arr[];
  14. while(sc.hasNext()){
  15. int n = sc.nextInt();
  16. arr = new int[n];
  17. for (int i = 0; i < n; i++){
  18. arr[i] = sc.nextInt();
  19. }
  20. System.out.println(solve(n, arr));
  21. }
  22. sc.close();
  23. }
  24. private static int solve(int n, int arr[]) {
  25. int left = 0;
  26. int right = n - 1;
  27. int ans = 0;
  28. while (left < right){
  29. if (arr[left] > arr[right]){
  30. arr[right-1] += arr[right];
  31. right--; ans++;
  32. }else if(arr[left] < arr[right]){
  33. arr[left+1] += arr[left];
  34. left++; ans++;
  35. }else{
  36. left++; right--;
  37. }
  38. }
  39. return ans;
  40. }
  41. }

[编程题] 优雅的点

小易有一个圆心在坐标原点的圆,小易知道圆的半径的平方。小易认为在圆上的点而且横纵坐标都是整数的点是优雅的,小易现在想寻找一个算法计算出优雅的点的个数,请你来帮帮他。
例如:半径的平方如果为25
优雅的点就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12个点。

输入描述:

输入为一个整数,即为圆半径的平方,范围在32位int范围内。

输出描述:

输出为一个整数,即为优雅的点的个数

输入例子:

25

输出例子:

12

解题思路:

说白了就是求一个数能否写成另外两个数平方和? 一共有几组呢?

源代码:

[java] view plain copy

  1. import java.util.Scanner;
  2. /**
  3. *
  4. * @author 慕一春
  5. * @version 1.0.0
  6. * @filename Main.java
  7. * @time 2016-9-21 下午2:50:56
  8. * @copyright(C) 2016
  9. */
  10. public class Main {
  11. public static int sum = 0;
  12. public static void main(String[] args) {
  13. Scanner sc = new Scanner(System.in);
  14. int n = sc.nextInt();
  15. int x = 0,y = 0;
  16. for (int i=1; i*i <= n; i++){
  17. x = i*i;
  18. y = (int) Math.sqrt(n - x);
  19. if (x + y*y == n) {
  20. sum++;
  21. }
  22. }
  23. System.out.println(sum*4);
  24. }
  25. }

[编程题] 跳石板

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板

输入描述:

输入为一行,有两个整数N,M,以空格隔开。
(4 ≤ N ≤ 100000)
(N ≤ M ≤ 100000)

输出描述:

输出小易最少需要跳跃的步数,如果不能到达输出-1

输入例子:

4 24

输出例子:

5

解题思路:

基础的动态规划问题

dp[i] 表示走到 i 位置需要的最短步数
在计算的时候,由于我们知道i位置的可以向前走的距离
当 i 位置可以走的时候,计算走到 i + x 位置时候的 最小步数

源代码:

[java] view plain copy

  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3. import java.util.TreeSet;
  4. /**
  5. *
  6. * @author 慕一春
  7. * @version 1.0.0
  8. * @filename Main.java
  9. * @time 2016-9-21 下午2:50:56
  10. * @copyright(C) 2016
  11. */
  12. public class Main {
  13. public static void main(String[] args) {
  14. Scanner sc = new Scanner(System.in);
  15. int n = sc.nextInt();
  16. int m = sc.nextInt();
  17. int dp[] = new int[m+1];
  18. Arrays.fill(dp, Integer.MAX_VALUE);
  19. dp[n] = 0;  // 到达起始位置步数为0步
  20. for (int i = n; i <= m; i++){
  21. if (dp[i] == Integer.MAX_VALUE) dp[i] = -1;
  22. else{
  23. TreeSet<Integer> list = bcd(i);
  24. while (!list.isEmpty()){
  25. int temp = list.pollFirst();
  26. if (i + temp <= m)
  27. dp[i+temp] = Math.min(dp[i+temp], dp[i]+1);
  28. }
  29. }
  30. }
  31. System.out.println(dp[m]);
  32. }
  33. /**
  34. *
  35. * @author 慕一春
  36. * @param num
  37. * @return 一个数的最大公约数集list
  38. */
  39. public static TreeSet<Integer> bcd(int num){
  40. TreeSet<Integer> list = new TreeSet<Integer>();
  41. int len = (int) Math.sqrt(num);
  42. for (int i = 2; i <= len; i++){
  43. if (num % i == 0){
  44. list.add(i);
  45. list.add(num/i);
  46. }
  47. }
  48. return list;
  49. }
  50. }

[编程题] 暗黑的字符串

一个只包含‘A‘、‘B‘和‘C‘的字符串,如果存在某一段长度为3的连续子串中恰好‘A‘、‘B‘和‘C‘各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:
BAACAACCBAAA 连续子串"CBA"中包含了‘A‘,‘B‘,‘C‘各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含‘A‘,‘B‘,‘C‘,所以是暗黑的字符串
你的任务就是计算出长度为n的字符串(只包含‘A‘、‘B‘和‘C‘),有多少个是暗黑的字符串。

输入描述:

输入一个整数n,表示字符串长度(1 ≤ n ≤ 30)

输出描述:

输出一个整数表示有多少个暗黑字符串

输入例子:

2
3

输出例子:

9
21

解题思路:

我们只需要考虑当前字符串最后两个字母的两种状态: 相同,例如:AA等 不相同,例如:AB等

动态规划,dp[i][0] 第i个字母以两相同字母结尾的暗黑字符串,dp[i][1] 第i个字母以两个不同字母结尾的暗黑字符串

状态转移方程式: dp[i][0] = dp[i-1][0] + dp[i-1][1] dp[i][1] = 2 * dp[i-1][0] + dp[i-1][1];

源代码:

[java] view plain copy

  1. import java.util.Scanner;
  2. /**
  3. *
  4. * @author 慕一春
  5. * @version 1.0.0
  6. * @filename Main.java
  7. * @time 2016-9-21 下午2:50:56
  8. * @copyright(C) 2016
  9. */
  10. public class Main {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. int n = sc.nextInt();
  14. if (n == 1){
  15. System.out.println(3);
  16. return;
  17. }
  18. long dp[][] = new long[n+1][2];
  19. dp[1][0] = 0; dp[1][1] = 0;
  20. dp[2][0] = 3; dp[2][1] = 6;
  21. for (int i = 3; i <= n; i++){
  22. dp[i][0] = dp[i-1][0] + dp[i-1][1];
  23. dp[i][1] = 2 * dp[i-1][0] + dp[i-1][1];
  24. }
  25. System.out.println(dp[n][0] + dp[n][1]);
  26. }
  27. }

[编程题] 数字翻转

对于一个整数X,定义操作rev(X)为将X按数位翻转过来,并且去除掉前导0。例如:
如果 X = 123,则rev(X) = 321;
如果 X = 100,则rev(X) = 1.
现在给出整数x和y,要求rev(rev(x) + rev(y))为多少?

输入描述:

输入为一行,x、y(1 ≤ x、y ≤ 1000),以空格隔开。

输出描述:

输出rev(rev(x) + rev(y))的值

输入例子:

123 100

输出例子:

223

解题思路:

5分钟调试完,没什么难度。

源代码:

[java] view plain copy

  1. import java.util.Scanner;
  2. /**
  3. *
  4. * @author 慕一春
  5. * @version 1.0.0
  6. * @filename Main.java
  7. * @time 2016-9-21 下午2:50:56
  8. * @copyright(C) 2016
  9. */
  10. public class Main {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. String x = sc.next();
  14. String y = sc.next();
  15. System.out.println(rev(String.valueOf(rev(x) + rev(y))));
  16. }
  17. public static int rev(String str){
  18. StringBuffer sb = new StringBuffer(str);
  19. return Integer.parseInt(sb.reverse().toString());
  20. }
  21. }

[编程题] 最大的奇约数

小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7 
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。

输入描述:

输入一个整数N (1 ≤ N ≤ 1000000000)

输出描述:

输出一个整数,即为f(1) + f(2) + f(3).......f(N)

输入例子:

7

输出例子:

21

解题思路:

很明显,f(n) 当n为奇数时,f(n) == n。

当n为偶数时,n不断除以2,直到n为奇数记作n‘,即 f(n) == n‘ 。

推导状态转移方程式:

f(n)为奇数时, f(n) = f(n-1) + n;

f(n)为偶数时, f(n) = f(n/2) + 1 + 3 + 5 + ... + (n-1) ——> f(n) = f(n/2) + n*n/4 (一张纸,一支笔很快就可以写出方程式。)

源代码:

[java] view plain copy

  1. import java.math.BigInteger;
  2. import java.util.Scanner;
  3. /**
  4. *
  5. * @author 慕一春
  6. * @version 1.0.0
  7. * @filename Main.java
  8. * @time 2016-9-21 下午2:50:56
  9. * @copyright(C) 2016
  10. */
  11. public class Main {
  12. public static void main(String[] args) {
  13. Scanner sc = new Scanner(System.in);
  14. int n = sc.nextInt();
  15. System.out.println(solve1(n));
  16. System.out.println(solve2(n));
  17. }
  18. private static BigInteger solve2(int n) {
  19. BigInteger sum = BigInteger.ZERO;
  20. while (true){
  21. if (n == 1){
  22. sum = sum.add(BigInteger.ONE);
  23. break;
  24. }
  25. else if(n % 2 == 1) {
  26. sum = sum.add(BigInteger.valueOf(n));
  27. n--;
  28. }else{
  29. sum = sum.add(BigInteger.valueOf(n).multiply(BigInteger.valueOf(n)).divide(BigInteger.valueOf(4)));
  30. n /= 2;
  31. }
  32. }
  33. return sum;
  34. }
  35. public static BigInteger solve1(int n) {
  36. if (n == 1) return BigInteger.ONE;
  37. if (n % 2 == 1) return solve1(n-1).add(BigInteger.valueOf(n));
  38. else    return solve1(n/2).add(BigInteger.valueOf(n).multiply(BigInteger.valueOf(n)).divide(BigInteger.valueOf(4)));
  39. }
  40. }

[编程题] 买苹果

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。

输入描述:

输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果

输出描述:

输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1

输入例子:

20

输出例子:

3

解题思路:

水题 ![1,100]的数据量暴力一下就好!

源代码:

[java] view plain copy

  1. import java.util.Scanner;
  2. /**
  3. *
  4. * @author 慕一春
  5. * @version 1.0.0
  6. * @filename Main.java
  7. * @time 2016-9-21 下午2:50:56
  8. * @copyright(C) 2016
  9. */
  10. public class Main {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. int n = sc.nextInt();
  14. int r = n / 6;
  15. int c = n / 8;
  16. int min = Integer.MAX_VALUE;
  17. for (int i = 0; i <= r; i++){
  18. for (int j = 0; j <= c; j++){
  19. if (i*6 + j*8 == n){
  20. if (min > i+j) min = i+j;
  21. }
  22. }
  23. }
  24. if (min == Integer.MAX_VALUE) System.out.println(-1);
  25. else System.out.println(min);
  26. }
  27. }

[编程题] 计算糖果

A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。

输入描述:

输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。
范围均在-30到30之间(闭区间)。

输出描述:

输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。
如果不存在这样的整数A,B,C,则输出No

输入例子:

1 -2 3 4

输出例子:

2 1 3

解题思路:

3个未知数,仅需3个一元一次方程就可以解答。这里多了一个就是一个限制条件而已了。 注意A,B,C都是整数!

源代码:

[java] view plain copy

    1. import java.util.Scanner;
    2. /**
    3. *
    4. * @author 慕一春
    5. * @version 1.0.0
    6. * @filename Main.java
    7. * @time 2016-9-21 下午2:50:56
    8. * @copyright(C) 2016
    9. */
    10. public class Main {
    11. public static void main(String[] args) {
    12. Scanner sc = new Scanner(System.in);
    13. int a = sc.nextInt();
    14. int b = sc.nextInt();
    15. int c = sc.nextInt();
    16. int d = sc.nextInt();
    17. if ((a+c)%2!=0 || (b+d)%2!=0) System.out.println("No");
    18. else{
    19. int A = (a+c)/2;
    20. int B = A-a;
    21. int C = B-b;
    22. if (B+C == d)
    23. System.out.println(A+" "+B+" "+C);
    24. else
    25. System.out.println("No");
    26. }
    27. }
    28. }
时间: 2024-08-29 06:36:30

2017网易秋招编程集合的相关文章

2017网易秋招--7、买苹果

题目描述:(DP问题) 小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分). 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带.如果不能购买恰好n个苹果,小易将不会购买. 输入描述: 输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果 输出描述: 输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1 输入例子: 20 输出例子: 3 思路:DP问题.首先dp[i] = min(dp[i],dp[i-a[j

2017网易秋招--8、计算糖果

A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息: A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数. 现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C.这里保证最多只有一组整数A,B,C满足所有题设条件. 输入描述: 输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开. 范围均在-30到30之间(闭区间). 输出描述: 输

网易2017秋招编程题集合-牛客网

网易2017秋招编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/0147cbd790724bc9ae0b779aaf7c5b50来源:牛客网 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,我还就只记住几个名字,说不定名字都记错.我向来不喜欢死记东西,能查到的真的不想背下来,而

滴滴出行秋招编程题

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题. 只因在今日头条刷到一篇文章,我就这样伤害我自己,手贱. 刷头条看到一篇文章写的滴滴出行2017秋招编程题,后来发现原文在这里http://www.cnblogs.com/SHERO-Vae/p/5882357.html.看了下,挺有意思,于是就想了想,又写了写,最终撸出来了.刚开始一看顿时感觉很熟悉,大学数据结构和算法课肯定讲过相关东西,什么深度搜索,广度搜索,最优路径,最优解...但是现在你让我说个一二三,

2017年秋招美团Java程序员开发,看我如何拿到offer

热乎的面经,昨天面的美团,虽然面完了HR面,但是感觉希望不大,希望能走运拿到offer吧.三面技术面面经如下: 一面: 中间省略掉大概几个问题,因为我不记得了,下面记得的基本都是我没怎么答好的... 1.了解SOA,微服务吗? 2.分布式系统如何负载均衡?如何确定访问的资源在哪个服务器上? 一.轮询.二.随机.三.最小响应时间.四. 最小并发数.五.哈希. 3.设计一个分布式负载均衡缓冲系统,如何快速定位到是那个服务器(使用key分段.一致性hash) 4.如何保证缓冲区和数据库之间的强一致性(

网易2017秋招编程题集合_以下代码全部来自牛客网

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列.现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和).现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列. 链接:https://ww

网易2017秋招编程题——回文序列 解题报告

Problem:https://www.nowcoder.com/question/next?pid=2811407&qid=46573&tid=6015849 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一种转换操作: 选择任意两个相邻的数,

网易秋招校招编程题

网易内推面试凉了,再战正式批笔试,选择和简答略难,编程题很良心,基本就是模拟.找规律,略加思考就能解出来的题目,本弱鸡只有在良心网易笔试才能AK. 1.翻转翻转 这题一开始没思路,ac了后两题后再回来思考,发现只需要判断某个位置周围有几个点,就代表了那个位置会被别的点翻转几次,那么如何求周围有几个点呢? 简单的把位置分成3类: 一类是四个顶点:每个顶点会被翻转4次(加上自己翻转一次). 第二类是四条边(不含顶点):边上的点会被翻转6次. 第三类就是中间部分:中间的每个点会被翻转9次. 因此翻转9