错误
- 段错误: 这次很大的一个收获是段错误,所谓的段错误 就是指访问的内存超出了系统所给这个程序的内存空间,因为这个题目给的是1~n,在测试样例和考虑范围内肯定要考虑极限,也就是给到n,而我在申请数组的时候申请的空间是n+1(一般是为了保险起见),所以一直报段错误。
- 跳出循环问题: break和continue的区别
循环套外层,内部有if判断条件,是否跳出当前这次循环,break的用法是跳出这层循环,continue是跳过这次循环进入下一次循环,也就是:
break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue
用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
这个问题需要在后续继续实践
使用的方法:虚拟数组
- 以给出的例子,图片如下:
申请一个与原数组相同大小的数组Num[],存储的数字为下标出现的次数,这个方法实现的时间复杂度是O(n),空间复杂度是O(n) - 因为题目的要求是输出哪个都可以,我就让结果一直替换,然后输出的最后一个。挂个小彩带:如果要输出所有的可以用数组存储,返回指针,或者直接printf;挂两条小彩带:输出第一个,不再替换,可以写break;
函数代码
int duplicate(int* numbers, int numbersLen ) {
// write code here
int j=0;
int ans = 0;
if (numbersLen < 2)
return -1;
else {
int Num[numbersLen];//用于计数
for (int k = 0; k < numbersLen; k++) {
Num[k] = 0;
}
int i;
for (i = 0; i <numbersLen; i++) {
int temp = numbers[i];
Num[temp]++;
}
//正常进行
for (j = 0; j < numbersLen; j++) {
if (Num[j] > 1)
{
ans = j;
}
}
}
return ans;
}
放在自己的编译器上的完整代码
#include<stdio.h>
int duplicate(int* numbers, int numbersLen );
int main()
{
int Numb[7]={2,3,1,0,2,5,3};
// int Numb[1] = {1};
int t = duplicate(Numb, 7);
// int t = duplicate(Numb, 1);
printf("%d",t);
return 0;
}
int duplicate(int* numbers, int numbersLen ) {
// write code here
int j=0;
int ans = 0;
if (numbersLen < 2)
return -1;
else {
int Num[numbersLen];//用于计数
for (int k = 0; k < numbersLen; k++) {
Num[k] = 0;
}
int i;
for (i = 0; i <numbersLen; i++) {
int temp = numbers[i];
Num[temp]++;
}
//正常进行
for (j = 0; j < numbersLen; j++) {
if (Num[j] > 1)
{
ans = j;
}
}
}
return ans;
}
未完待续:
开个小窗户:输入流输入;
还可以用set实现