第50题——数组中重复的数字

159 阅读2分钟

题目:

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

思路:

  • 思路一:利用hash,下标表示numbers数组中的数字,下标所对应的值为该数字出现的次数,遍历hash,若出现值大于1的就返回true,否则返回false。
  • 思路二:同样利用hash,较思路一不同的是,不创建新的hash数组,在原数组的基础上

Java 思路一

package nowcoder;

public class S50_Duplicate {
    public boolean duplicate(int[] numbers, int length, int[] duplicatioin){
        if(numbers == null)
            return false;
        for (int i=0;i<length;i++){
            if (numbers[i] < 0 || numbers[i] > length)
                return false;
        }
        int[] hash = new int[length];
        for (int i=0;i<length;i++){
            hash[numbers[i]]++;
        }
        for (int i=0;i<length;i++){
            if (hash[i] > 1) {
                duplicatioin[0] = i;
                System.out.println(duplicatioin[0]);
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args){
        S50_Duplicate s50 = new S50_Duplicate();
        int[] numbers = {2,3,1,0,2,5,3};
        int[] dup = new int[1];
        System.out.println(s50.duplicate(numbers, numbers.length, dup));
    }
}

Java 思路二

package nowcoder;

public class S50_Duplicate_new {
    public boolean duplicate(int[] numbers, int length, int[] duplicatioin){
        if(numbers == null)
            return false;
        for (int i=0;i<length;i++){
            if (numbers[i] < 0 || numbers[i] > length)
                return false;
        }
        for (int i=0;i<length;i++){
            while (i != numbers[i]){
                if (numbers[i] == numbers[numbers[i]]){
                    duplicatioin[0] = numbers[i];
                    System.out.println(duplicatioin[0]);
                    return true;
                }
                int temp = numbers[i];
                numbers[i] = numbers[temp];
                numbers[temp] = temp;
            }
        }
        return false;
    }
    public static void main(String[] args){
        S50_Duplicate_new s50 = new S50_Duplicate_new();
        int[] numbers = {2,3,1,0,2,5,3};
        int[] dup = new int[1];
        System.out.println(s50.duplicate(numbers, numbers.length, dup));
    }
}

Python

class Duplicate:
    def duplicate(self,numbers,dup):
        if not numbers:
            return False
        length = len(numbers)
        for i in range(0, length):
            if numbers[i] > length or numbers[i] < 0:
                return False
            while i != numbers[i]:
                if numbers[i] == numbers[numbers[i]]:
                    dup[0] = numbers[i]
                    print(dup[0])
                    return True
                else:
                    #交换
                    temp = numbers[i]
                    numbers[i] = numbers[temp]
                    numbers[temp] = temp
            return False
if __name__ == '__main__':
    test = Duplicate()
    numbers = [1, 2, 1]
    dup = [1]
    print(test.duplicate(numbers, dup))