塞码考试系统里的输入,到底是怎么回事

前言:最近参加了几场实习生笔试,编程题全军覆没,但是本地明明就是对的啊!!今天花了一早上,终于知道问题出在哪了,和我有同样情况的童鞋可以参考,也许可以解决你的困惑!

重点:我一直理解错的地方就是,我以为是给我一组(一组表示一次用例的所有数据)数据,我输出一组结果就可以。然而并不是这样!很多题目是一次性给你多组数据,也就是说要求是:一次性给你所有的测试数据,你依次把你的结果全部输出来。举个例子:

下面是塞码网上京东2016的一道真题(题目可以不用认真看,看输入的地方,输入有若干组)

image

假设我定义第一行输入为n,第二行为arr,我以前都是这样写的(错误的写法):

image

于是结果就是不对,反正怎么调都不对!我们必须这样写(正确的写法):

image

也就是必须用循环来读取输入,且主要代码必须在循环里,否则系统无论给多少组数据,按错误的写法永远只会有一个输出。这个输出对于第一组数据来说是对的,但系统想要的应该是多组输出,所以就会被判为错误。

上面京东的题目,大家可以去试一试,http://exercise.acmcoder.com/quesexcuse?paperId=176中的第26题。

错误的代码:

var n=parseInt(read_line());
var arr =str.split(" ");
fun(n,arr);
//以下代码不变
function fun(n,arr){
 var dong = arr[0];
var count=0;
arr.sort(function(a,b){return a-b;});
var index = arr.indexOf(dong);
while(index<n-1){
        arr[n-1]--;
        dong++;
        arr[index]=dong;
        count++;
        arr.sort(function(a,b){return a-b});    
       index =arr.indexOf(dong);
}
  print(count);
  
}

结果如下:

image

可以看出,系统给了我很多组数据,我的输出只有一个(其实这个输出结果和刚刚题目上第一个例子的结果是一样的,说明我思路没错),所以判定错误。

正确的代码:

var n;
while(n=parseInt(read_line())){
var arr = read_line().split(' ');
  fun(n,arr);
}
//以下代码不变
function fun(n,arr){
  var dong = arr[0];
var count=0;
arr.sort(function(a,b){return a-b;});
var index = arr.indexOf(dong);
while(index<n-1){
        arr[n-1]--;
        dong++;
        arr[index]=dong;
        count++;
        arr.sort(function(a,b){return a-b});    
       index =arr.indexOf(dong);
}
  print(count);
  
}

结果如下:

image

只改变了输入的方式,结果就对了!

苍天啊,我终于弄明白了,简直想哭Smile,那么多笔试全部掉坑里了。如果你和我遇到一样的情况,希望对你有所帮助!

 

原文地址:https://www.cnblogs.com/youhong/p/6661664.html