我想在不使用数组的情况下从序列中找到第二高的数字。
说明如下。
给定一个整数序列作为输入,以a结尾 -1。 (也就是说,输入整数可以是正数,负数或0. A -1 在输入信号中输入结束。)
-1不被视为输入的一部分。
找到输入中的第二大数字。你可能不会使用数组。
我做的是这个。
Sample Test Cases
Input
Test Case 1
-840 -288 -261 -337 -335 488 -1
Output
-261
Test Case 2
-840 -335 -1
Output
-840
示例测试用例将如下所示。
f <- function( v ) {
if( sum(is.na(v)) > length(v)*0.25 ) return(NA)
mean(v, na.rm = TRUE)
}
我不知道从哪里开始,哪里出错了。
答案 0 :(得分:4)
我不会解决你的作业,但会提供一些提示:
您应该为变量提供明确的名称,以反映其目的。 i
,a
,temp
和sec
等名称会使代码难以理解。
您应该初始化所有变量。例如,sec
的初始化有点不确定。
您不需要两个循环。
以下if
是无操作(这意味着无条件执行后面的break
):
if (a == -1) ;
最后,最重要的是,在迭代数字时需要处理三种情况:
目前的数字大于迄今为止看到的最大数字。
目前的数字不大于最大值,但大于目前为止的第二大数字。
当前数字不大于第二大数字。
希望,这将为您提供足够的进展以取得更多进展。如果您遇到困难,请发布另一个问题。
答案 1 :(得分:2)
试试这个。
#include <stdio.h>
#define INT_MIN -999999; //define minimum value
int main() {
int input, firstMax = INT_MIN;
int secMax = INT_MIN;
do {
scanf("%d", &input);
if (input == -1)
break;
if(input > firstMax) { //find new first max value
secMax = firstMax; //set previous max to second max
firstMax = input; //update first max to new value
}
else if(input > secMax) {
secMax = input; //new second max value is found. update it
}
} while(1);
printf("%d", secMax);
return 0;
}
答案 2 :(得分:0)
这个怎么样?
编辑:适用于SUSE Linux 11上的GCC 4.3.4版本
#include <stdio.h>
#include <limits.h>
int main(void) {
int i, a, temp, sec, largest;
sec = INT_MIN;
largest = INT_MIN;
while (1) {
scanf("%d", &a);
if (a == -1) {
break;
}
if (a > largest) {
sec = largest;
largest = a;
} else if (a > sec) {
sec = a;
}
}
printf("%d", sec);
return 0;
}
我还没有纠正一些不良的代码味道,但我只是做了一个快速而肮脏的回答
答案 3 :(得分:-1)
您可以尝试这种方式:
#include <stdio.h>
#include <limits.h>
int main() {
int a, first = INT_MIN, sec = INT_MIN;
while(1){
scanf("%d", &a);
if (a == -1)
break;
if(a > first) {
sec = first;
first = a;
}
else if(a > sec) {
sec = a;
}
}
printf("%d", sec);
return 0;
}