一、题目叙述与算法思想概述
题目如下:
![](https://img-blog.csdnimg.cn/img_convert/e67adbf6ed7115fc15109e416da203c9.png)
这道题的主流思想方法是先排除一些明显的错误数组(比如数组元素超出数组大小不符合题意)之后,进行排序。在排序的过程中发现重复值。如果可以从0到n-1一一对应的排序,就说明没有重复值,则返回-1。
以上是我的叙述,以下是官方思路:
![](https://img-blog.csdnimg.cn/img_convert/d39876786b41b54f8ba01af50e6909fa.png)
二、个人的第一次错误编写
我本人设置了一个循环,在循环中
如果该数组元素numbers[i]与位置的序号i的值是一样的,那就不管
如果该数组元素numbers[i]与位置的序号i的值是不一样的,那就看该数组元素numbers[i]是否与numbers[numbers[i]]是一样的,
如果一样,则说明重合,返回该值即可
如果不一样,则交换顺序,然后继续循环
如果循环结束,还是没找到,并且数组已经一一排序完成,则说明没有重复值,返回-1
class Solution {
public:
int duplicate(vector<int>& numbers) {
// write code here
int i,temp;
for (i=0;i<numbers.size()+1;i++)//有错
{if (numbers[i]<0||numbers[i]>numbers.size())//有错
{return -1;}
if (numbers.size()<=1)
{return -1;}}
for (i=0;i<numbers.size()+1;i++)//有错
{ while(numbers[i]!=i)
{
if(numbers[i]==numbers[numbers[i]])
{return numbers[i];}
else
{temp=numbers[i];//18到20行都有错
numbers[temp]=numbers[i];
numbers[i]=numbers[numbers[temp]];}
}
return-1;//有错
};
}
};
以上代码语法在编译器里没显示有问题,我本人编写完的时候还觉得挺完美的,但是拿测试的数组测了一下就发现很明显有问题了。
在自测输入里给出了这个答案(感觉好像不是我语法的问题??):
![](https://img-blog.csdnimg.cn/img_convert/b0053f9d53462c35476a02c34824d3c9.png)
而在调试器里又给出了这个答案:
![](https://img-blog.csdnimg.cn/img_convert/e0be2331f8c7223f76326d5374d8e0c1.png)
总而言之,不管是什么意思,这段代码是有问题的,所以还是要仔细思考一下为什么出错。今天已经很晚了,不想熬夜检查了,直接发布出来打算明后天再修改,如果有大佬愿意指出错误,万分感谢!!
三、发现错误并改正错误
更新:
前两天出去玩了,今天回来仔细推敲了一下代码的问题,也和我爸讨论了一下,发现了以下错误:
第22行的return -1, 中间没有打空格。
第22行的这个return不应该在for语句的函数体内部,否则每一个i,都会做一次return-1,相当于第一次循环除非直接找到重复值,否则都有输出-1了。
第6行以及第12行的for语句不是i<numbers.size()+1,而是i<=numbers.size()
第18到20行的交换,本来是打算练习一下自己的数组内元素交换的水平,所以没有用swap函数,但是错了。
在改正以上错误的时候,基本上在测试中很多的输入都对了,甚至牛客网的自动批改系统也认定我正确了。但当我输入了[0,1,2,3,5]这个测试输入的时候,就发生报错了。后来仔细看了一下,是第7行||的后面那个语句里>应该写成>=,原因是数组是从0开始,所以等于也是错的。
改正了以上错误之后,代码就完全成功了,下面附上代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
// write code here
int i,temp;
for (i=0;i<numbers.size();i++)
{ //>=的原因是数组是从0开始,所以等于也是错的
if (numbers[i]<0 || numbers[i]>=numbers.size())
return -1;
if (numbers.size()<=1)
return -1;
}
for (i=0;i<numbers.size();i++)
{
while(numbers[i]!=i)
{
if(numbers[i]==numbers[numbers[i]])
return numbers[i];
else
{
temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}
}
};
return -1;
}
};
这次也是我人生第一次徒手敲代码然后编译成功,当然以前那些Hello world或者改一改别人代码的不算。我对此感到非常开心。但是这道题还没结束,本身还有一个做法,是用哈希表来做。我暂时还不知道啥叫哈希表,所以可能要先学习一下再来更新第二种做法。