[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目

一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。

思路一

寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中。如果哈希表中已经存在这个元素则说明这就是个重复元素。这种方法可以很方便的在O(n)时间内完成对重复元素的查找。可是题目要求在O(1)的空间。因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的。题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n。因此我们实际要做的就是对n个范围为0到n-1的数进行哈希,而哈希表的大小刚好为n。对排序算法比较熟悉的同学不难发现这与一种经典的排序算法(基数排序)非常类似。而基数排序的时间空间复杂度刚好符合题目要求。因此尝试使用基数排序来解这道面试题。

代码

    /*---------------------------------------------
    *   日期:2015-02-19
    *   作者:SJF0115
    *   题目: 找重复元素
    *   来源:
    *   博客:
    -----------------------------------------------*/
    #include <iostream>
    #include <algorithm>
    using namespace std;

    class Solution {
    public:
        int IsReplication(int a[],int n){
            if(n <= 0){
                return -1;
            }//if
            for(int i = 0;i < n;){
                if(a[i] != i){
                    // 存在重复元素
                    if(a[i] == a[a[i]]){
                        return a[i];
                    }//if
                    swap(a[i],a[a[i]]);
                }//if
                else{
                    ++i;
                }//else
            }//for
            return -1;
        }
    };

    int main() {
        Solution solution;
        int num[] = {6,1,4,7,5,3,6,2};
        int result = solution.IsReplication(num,8);
        cout<<result<<endl;
    }
时间: 2024-12-15 01:50:13

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素的相关文章

在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) { //在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行 int [] x=new int[50]; int a =1; for(int i=0;i<50;i++) { x[i]=a; a+=2; } for(

在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10]; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { if(i==j||i+j==9) { y[i][j]='*'; } else { y[i][j]='#'; } } } for(int i =0;i<10;i++) { for(int k

打印出大小为n的数组(可能有重复元素)里所有可能的组合

Input: {1, 2, 3, 4}, r=2 Output: {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4} and {3, 4}. package recursion; import java.util.ArrayList; import java.util.Collections; public class Print_all_possible_combinations_of_r_elements_in_a_given_array_of_size_n { /

.is() 检查当前的配套与选择器,jQuery对象的元素,或返回TRUE如果在这些元素的至少一个匹配给定的参数。

<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>is demo</title> <style> div { width: 60px; height: 60px; margin: 5px; float: left; border: 4px outset; background: green; t

如何用最快的速度读出大小为10G的文件的行数?弄懂 python 的迭代器

1 with open('rm_keys.txt', 'r', encoding = 'utf-8') as f: 2 3 count = 0 4 5 for line in f: 6 7 count += 1 8 9 print(count) for line in f 将文件对象 f 视为一个可迭代的数据类型,会自动使用 IO 缓存和内存管理,这样就不必担心大文件了. 一.先理解可迭代对象的本质 随便封装了一个可以存放多条数据的类型是不能迭代的--需要添加了__iter__方法. 可迭代对象

按要求编写Java应用程序。 编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

package com.homework.zw; public class work3 { public static void main(String[] args) {//定义数组x和y的类型 int[] x=new int[50]; char[][] y=new char[10][10]; int j =1; int n =0; //定义数组x的每一个元素 for(int i=0;i<50;i++) { x[i]=j; j=j+2; } System.out.println("一维数

编写一个名为Test的主类,类中只有一个主方法; 在主方法中定义一个大小为50的一维整型数组,数组名为x,数组中存放着{1, 3,5,…,99}输出这个数组中的所有元素,每输出十个换一行;在主方法中定义一 个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

package liu0915; import java.util.Random; public class Test0915sz { public static void main(String[] args) { int[] x=new int[50]; int j=1; for(int i=0;i<50;i++) { x[i]=j; j=j+2; } System.out.println("一维数组是:"); int n=0; for (int a=1;a<=5;a+

剑指Offer面试题51(Java版):数组中重复的数字

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数.请找出数组中任意一个重复的数字. 例如如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 解决这个问题的一个简单的方法是先把输入的数组排序.从排序的数组中找出重复的数字是件容易的事情,只需要从头到尾扫描排序后的数组就可以了.排序一个长度为n的数组需要时间为O(nlogn)时间. 还可以利用哈希表来解决这个问题,从头到尾

剑指Offer面试题51(Java版):数组中反复的数字

题目:在一个长度为n的数组里的全部数字都在0到n-1的范围内. 数组中某些数字是反复的,但不知道有几个数字反复了.也不知道每一个数字反复的次数.请找出数组中随意一个反复的数字. 比如假设输入长度为7的数组{2,3,1,0,2,5,3},那么相应的输出是反复的数字2或者3. 解决问题的一个简单的方法是先把输入的数组排序.从排序的数组中找出反复的数字是件easy的事情,仅仅须要从头到尾扫描排序后的数组就能够了.排序一个长度为n的数组须要时间为O(nlogn)时间. 还能够利用哈希表来解决问题.从头到