2017年网易校招笔试编程题第二题
2016-08-06 22:44
477 查看
1、题目
未曾将题目抄下,大致题意如下:
给定n个正整数组成的数列,找出取这n个正整数中的一部分数字求和所不能得到的最小数。
【输入】第一行:一个正整数n,为数列整整数的个数
第二行:n个正整数(由空格隔开)
【输出】取这n个正整数中的一部分数字求和所不能得到的最小数。
2、 举例
【输入】3
5 1 2
【输出】4
3、 我的思路
先将数组进行从小到大排序,然后依次检查数组中是否存在seed(1,2,3……)
(1) 如果存在与seed相等的数字,则seed加1,进入下一轮判断;
(2) 如果不存在与seed相等的数字但存在大于seed的数字,则跳出循环,并判断当前已经比较过的数字之和是否大于seed。如果大于,则已经比较过的这些数字肯定可以组合成seed,则seed加1进入下一轮判断,否则,已经比较过的这些数字肯定不能组合成seed,该seed符合条件;
(3) 如果数组中不存在大于等于seed的数字,则判断数组中所有数字之和是否大于seed。如果大于,那么数组中数字肯定可以组合成seed,则seed加1进入下一轮判断,否则,已经比较过的这些数字肯定不能组合成seed,该seed符合条件;
4、 实现如下:
以下实现通过所有测试用例。
5、 考后反思
在写这篇博客的时候,我发现其实第3部分中的思路存在很多问题。
第3部分中第(3)种情况只可能发生在数组为1,2……n时,所以此时可以直接断定取这n个正整数中的一部分数字求和所不能得到的最小数是数组中所有数字之和加1,而不用再进行比较。
6、 修改后代码
以下实现未进行所有用例的测试。
7、 总结
我在这里所写题目的解题思路,只是抛砖引玉,肯定还有很多大神有更好的实现方式,望不吝赐教,不胜感激。
未曾将题目抄下,大致题意如下:
给定n个正整数组成的数列,找出取这n个正整数中的一部分数字求和所不能得到的最小数。
【输入】第一行:一个正整数n,为数列整整数的个数
第二行:n个正整数(由空格隔开)
【输出】取这n个正整数中的一部分数字求和所不能得到的最小数。
2、 举例
【输入】3
5 1 2
【输出】4
3、 我的思路
先将数组进行从小到大排序,然后依次检查数组中是否存在seed(1,2,3……)
(1) 如果存在与seed相等的数字,则seed加1,进入下一轮判断;
(2) 如果不存在与seed相等的数字但存在大于seed的数字,则跳出循环,并判断当前已经比较过的数字之和是否大于seed。如果大于,则已经比较过的这些数字肯定可以组合成seed,则seed加1进入下一轮判断,否则,已经比较过的这些数字肯定不能组合成seed,该seed符合条件;
(3) 如果数组中不存在大于等于seed的数字,则判断数组中所有数字之和是否大于seed。如果大于,那么数组中数字肯定可以组合成seed,则seed加1进入下一轮判断,否则,已经比较过的这些数字肯定不能组合成seed,该seed符合条件;
4、 实现如下:
以下实现通过所有测试用例。
import java.util.Arrays; import java.util.Scanner; public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int[] input = new int ; int sum = 0; //把输入的n个数存入数组 for(int i =0; i < n; i++) { int temp = in.nextInt(); sum += temp; input[i] = temp; } Arrays.sort(input); int seed = 1; while(true) { int flag = 0; int sum2 = 0; for(int k =0; k < n; k++) { if(input[k] == seed) { flag = 1; break; } if(input[k] > seed) { flag = 2; break; } sum2 += input[k]; } if(flag == 0 && seed > sum) { System.out.println(seed); break; } else if(flag == 1) { seed ++; } else { if(sum2 < seed) { System.out.println(seed); break; } seed ++; } } } } }
5、 考后反思
在写这篇博客的时候,我发现其实第3部分中的思路存在很多问题。
第3部分中第(3)种情况只可能发生在数组为1,2……n时,所以此时可以直接断定取这n个正整数中的一部分数字求和所不能得到的最小数是数组中所有数字之和加1,而不用再进行比较。
6、 修改后代码
以下实现未进行所有用例的测试。
import java.util.Arrays; import java.util.Scanner; public class Test2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int[] input = new int ; int sum = 0; //把输入的n个数存入数组 for(int i =0; i < n; i++) { int temp = in.nextInt(); sum += temp; input[i] = temp; } Arrays.sort(input); int seed = 1; while(true) { int flag = 0; int sum2 = 0; for(int k =0; k < n; k++) { if(input[k] == seed) { flag = 1; break; } if(input[k] > seed) { flag = 2; break; } sum2 += input[k]; } //可以之后断定符合条件的值 if(flag == 0) { System.out.println(sum+1); break; } else if(flag == 1) { seed ++; } else { if(sum2 < seed) { System.out.println(seed); break; } seed ++; } } } } }
7、 总结
我在这里所写题目的解题思路,只是抛砖引玉,肯定还有很多大神有更好的实现方式,望不吝赐教,不胜感激。
相关文章推荐
- 2017年网易校招笔试编程题第一题
- 2017年校招全国统一模拟笔试(第二场)编程题集合--Python
- 网易2017年校招笔试题--最大奇约数
- 网易2017校招内推笔试练习卷编程题2--出专辑
- (网易2018校招笔试)[编程题] 魔法币
- 2017年校招全国统一模拟笔试(第三场)编程题集合
- 2017年网易内推笔试编程题1
- (网易2018校招笔试)[编程题] 游历魔法王国
- 网易2017内推笔试编程题合集(二)第二题 幸运的袋子
- (网易2018校招笔试)[编程题] 相反数
- 2017年搜狗校招Java研发笔试编程题
- 递归的理解【爱奇艺2017年校招笔试题 第一道编程题】
- (网易2018校招笔试)[编程题] 相反数
- 2017年校招全国统一模拟笔试(第一场)编程题集合--Python
- 2017年校招全国统一模拟笔试(第四场)编程题集合--Python
- 网易2017校招内推在线笔试编程题3
- (网易2018校招笔试)[编程题] 字符串碎片
- 网易2018届校招笔试-编程题
- 女友校招笔试编程题:网易测试岗-买苹果和求最大奇约数
- 牛客网2017年校招全国统一模拟笔试(第一场)编程题集合