数组中重复出现的数字

代码实现的不同方法用(#if 0 ..... #endif)注释

  1 #include<Windows.h>
  2 #include<stdio.h>
  3 #if 0
  4 //这种方法使用两个指针来遍历数组,运用两个for循环,时间复杂度为O(n^2),空间复杂度为O(1)
  5 void test()
  6 {
  7     int array[7] = { 0, 3, 1, 0, 2, 5, 3 };
  8     int i = 0;
  9     for (i = 0; i < 7;i++)
 10     {
 11         int j = i + 1;
 12         for (; j < 7; j++)
 13         {
 14             if (array[i] == array[j])
 15             {
 16                 printf("重复的数字为:%d \n", array[i]);
 17                 return;
 18             }
 19         }
 20     }
 21     if (i>=7)
 22         printf("没找到重复的数字\n");
 23 }
 24 #endif
 25 #if 0
 26 //这种方法是先通过冒泡排序将数组排序,时间复杂度为O(n^2),空间复杂度为O(1);
 27 void test()
 28 {
 29     int array[7] = { 2, 3, 1, 0, 2, 5, 3 };
 30     int i = 0;
 31     for (i = 0; i < sizeof(array) / sizeof(array[0]); i++)
 32     {
 33         int j = 0;
 34         for (j = 0; j < i; j++)
 35         {
 36             if (array[j] > array[i])
 37             {
 38                 int temp = array[j];
 39                 array[j] = array[i];
 40                 array[i] = temp;
 41             }
 42         }
 43     }
 44     for (i = 0; i < 6; i++)
 45     {
 46         if (array[i] == array[i + 1])
 47         {
 48             printf("重复出现的数字为:");
 49             printf("%d ", array[i]);
 50         }
 51     }
 52 }
 53 #endif
 54 //这种方法使用折半插入排序对数组进行排序
 55 //比较次数虽然为nlog(n)(以2为底),但是时间复杂度任然为O(N^2);
 56
 57 void test()
 58 {
 59     int array[7] = { 0, 3, 1, 0, 2, 5, 3 };
 60     int i = 2;
 61     for (i = 2; i < sizeof(array) / sizeof(array[0]); i++)
 62     {
 63         int low = 1; int high = i - 1;
 64         int temp = array[i];
 65         while (low <= high)
 66         {
 67             int mid = (high - low) / 2 + low;
 68             if (temp < array[mid])
 69                 high = mid - 1;
 70             else
 71                 low = mid + 1;
 72         }
 73         //移动元素
 74         int j = 0;
 75         for (j = i - 1; j>=low; j--)
 76         {
 77             array[j + 1] = array[j];
 78         }
 79         array[low] = temp;
 80     }
 81     for (i = 0; i < sizeof(array)/sizeof(array[0])-1; i++)
 82     {
 83         if (array[i] == array[i + 1])
 84         {
 85             printf("重复出现的数字为:");
 86             printf("%d ", array[i]);
 87         }
 88     }
 89 }
 90
 91 int main()
 92 {
 93     test();
 94     system("pause");
 95     return 0;
 96 }
 97 //在提一种思路,如果数组中的元素已经排好序了,则它的元素应该与它的下标相同,可以根据这个
 98 //方法实现快速的排序,从而找到重复的数字,当然,这种方法只针对特殊情况。
 99 //代码中尽管有两重循环,但每个数字最多只要交换两次就能找到属于它的位置,因此总的时间复杂度为O(n),
100 //空间复杂度为O(1);
101 #if 0
102 bool duplicate(int numbers[], int *temp, int length)
103 {
104     if (numbers == NULL || length <= 0)
105         return false;
106     for (int i = 0; i < length; i++)
107     {
108         if (numbers[i]<0 || numbers[i]>length - 1)
109             return false;
110     }
111     for (int i = 0; i < length; i++)
112     {
113         while (numbers[i] != i)
114         {
115             if (numbers[i] == numbers[numbers[i]])
116             {
117                 *temp = numbers[i];
118                 return true;
119             }
120             //交换numbers[i]与numbers[numbers[i]]
121             int t = numbers[i];
122             numbers[i] = numbers[numbers[i]];
123             numbers[numbers[i]] = t;
124         }
125     }
126 }
127 #endif

原文地址:https://www.cnblogs.com/love-you1314/p/9750664.html

时间: 2024-11-05 18:28:41

数组中重复出现的数字的相关文章

华为OJ平台试题 ——字符串:输出数组中重复的数组

<pre name="code" class="cpp">/* * 题目:输出数组中重复出现的数组(0-9) * * 输入:输入一串数字,中间以逗号隔开,如3,2,2,3,5,6,7,8,9 * 输出:输出数组中重复出现的数字(数字间以空格隔开),输出顺序按原数组中的先后顺序,输出3,2 */ #include<stdio.h> #include<string.h> #define N 256 /* * 定义一个结构体:数字和数字

查找数组中重复的数字

题目来源于<剑指Offer>中的面试题3:找出数组中重复的数字. // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3}, // 那么对应的输出是重复的数字2或者3. 解决方法有多种,包括数组排序,哈希表法,以及作者推荐的重排数组法.此处介绍自己的一个做法,以空间换时间,通过新建数组来实现快速查

去掉数组中重复的数字

冒泡排序语法: for (int i = 0; i < 数组长度 - 1; i++) { for (int j = 0; j < 数组长度 - i - 1; j++) { if (数组名[j] < 数组名[j + 1]) { int empty = 数组名[j]; 数组名[j] = 数组名[j + 1]; 数组名[j + 1] = empty; } } } 上面这个语法是降序排序,如果想升序的话就把if(数组名[j]<数组名[j=1])里面的小于号“<”改成大于号“>”

剑指offer之【数组中重复的数字】

题目: 数组中重复的数字 链接: https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不

(笔试题)把一个整数数组中重复的数字去掉

题目: 把一个整数数组中重复的数字去掉,并输出剩下的不重复的元素.(要求不能开辟新空间) 思路: 先排序,然后遍历数组比较,详见代码 代码: #include <iostream> #include <algorithm> using namespace std; int cmp(const void* a,const void* b){ return (*(int*)a-*(int*)b); } int unique(int* a,int n){ int k=0; for(int

去掉有序数组中重复数字 原地 leetcode java (最简单的方法)

1.利用荷兰国旗的思路,每次记住最后一个位置,遇到一个不重复的数,放在它后面,代码很简单. Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with consta

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

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

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

【剑指offer】3、数组中重复的数字

题目一:找出数组中重复的数字. ......S2 ..... 1 class Solution { 2 public: 3 // Parameters: 4 // numbers: an array of integers 5 // length: the length of array numbers 6 // duplication: (Output) the duplicated number in the array number 7 // Return value: true if t