算法小白初刷《剑指offer》3.数组中重复的数字

一、题目叙述与算法思想概述

题目如下:

这道题的主流思想方法是先排除一些明显的错误数组(比如数组元素超出数组大小不符合题意)之后,进行排序。在排序的过程中发现重复值。如果可以从0到n-1一一对应的排序,就说明没有重复值,则返回-1。

以上是我的叙述,以下是官方思路:

二、个人的第一次错误编写

我本人设置了一个循环,在循环中

如果该数组元素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;//有错
       };    
            }
    };

以上代码语法在编译器里没显示有问题,我本人编写完的时候还觉得挺完美的,但是拿测试的数组测了一下就发现很明显有问题了。

在自测输入里给出了这个答案(感觉好像不是我语法的问题??):

而在调试器里又给出了这个答案:

总而言之,不管是什么意思,这段代码是有问题的,所以还是要仔细思考一下为什么出错。今天已经很晚了,不想熬夜检查了,直接发布出来打算明后天再修改,如果有大佬愿意指出错误,万分感谢!!

三、发现错误并改正错误

更新:

前两天出去玩了,今天回来仔细推敲了一下代码的问题,也和我爸讨论了一下,发现了以下错误:

  1. 第22行的return -1, 中间没有打空格。

  1. 第22行的这个return不应该在for语句的函数体内部,否则每一个i,都会做一次return-1,相当于第一次循环除非直接找到重复值,否则都有输出-1了。

  1. 第6行以及第12行的for语句不是i<numbers.size()+1,而是i<=numbers.size()

  1. 第18到20行的交换,本来是打算练习一下自己的数组内元素交换的水平,所以没有用swap函数,但是错了。

  1. 在改正以上错误的时候,基本上在测试中很多的输入都对了,甚至牛客网的自动批改系统也认定我正确了。但当我输入了[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或者改一改别人代码的不算。我对此感到非常开心。但是这道题还没结束,本身还有一个做法,是用哈希表来做。我暂时还不知道啥叫哈希表,所以可能要先学习一下再来更新第二种做法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值