找到一个重复元素 - 面试题
2015-09-05 19:46
661 查看
对于n个元素,每一个数据的范围[0,n-1],找到一个重复元素,空间O(1),时间O(n)
解法一:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int radix_sort (int *arr, int num) {
int temp;
for (int i = 0;i < num;i++) {
while (i != arr[i]) {
if (arr[i] == arr[arr[i]]) {
return arr[i];
}
temp = arr[arr[i]];
arr[arr[i]] = arr[i];
arr[i] = temp;
}
}
return -1;
}
int main (void) {
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (int i = 0;i < num;i++) {
scanf ("%d", &arr[i]);
}
int flag = radix_sort (arr, num);
if (flag == -1) {
printf ("No repeating elements\n");
}
else {
printf ("Repeating elements: %d\n", flag);
}
}
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int RepeatNum (int *arr, int num) {
for (int i = 0;i < num;i++) {
int index = arr[i] >= num ? arr[i]-num : arr[i];
if (arr[index] >= num) {
return index;
}
else {
arr[index] += num;
}
}
return -1;
}
int main (void) {
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (int i = 0;i < num;i++) {
scanf ("%d", &arr[i]);
}
int flag = RepeatNum (arr, num);
if (flag == -1) {
printf ("No repeating elements\n");
}
else {
printf ("Repeating elements: %d\n", flag);
}
}
return 0;
}
解法一:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int radix_sort (int *arr, int num) {
int temp;
for (int i = 0;i < num;i++) {
while (i != arr[i]) {
if (arr[i] == arr[arr[i]]) {
return arr[i];
}
temp = arr[arr[i]];
arr[arr[i]] = arr[i];
arr[i] = temp;
}
}
return -1;
}
int main (void) {
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (int i = 0;i < num;i++) {
scanf ("%d", &arr[i]);
}
int flag = radix_sort (arr, num);
if (flag == -1) {
printf ("No repeating elements\n");
}
else {
printf ("Repeating elements: %d\n", flag);
}
}
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int RepeatNum (int *arr, int num) {
for (int i = 0;i < num;i++) {
int index = arr[i] >= num ? arr[i]-num : arr[i];
if (arr[index] >= num) {
return index;
}
else {
arr[index] += num;
}
}
return -1;
}
int main (void) {
int num;
int arr[100];
while (scanf ("%d", &num) != EOF) {
for (int i = 0;i < num;i++) {
scanf ("%d", &arr[i]);
}
int flag = RepeatNum (arr, num);
if (flag == -1) {
printf ("No repeating elements\n");
}
else {
printf ("Repeating elements: %d\n", flag);
}
}
return 0;
}
相关文章推荐
- 黑马程序员——Java中的面向对象
- 黑马程序员之Collection类
- 黑马程序员之Map集合以及Collections静态方法
- BAT面试
- 临睡前的十分钟,决定未来职场的高度
- 程序员的十个层次
- 说我装13?过来,打屎你!(揭秘程序员装13面具)
- 程序员有趣的面试智力题
- 黑马程序员-Java基础:常用API
- 腾讯面试(三)
- 【年度总结】一个程序员的自我修养
- 黑马程序员--IO流(操作对象、管道流、RandomAccessFile)
- [翻译]程序员需要掌握的6项相关技能
- 黑马程序员——面向对象(多态+接口实现)-第18天
- 黑马程序员—Java基础:初识Java
- 黑马程序员----oc基础笔记----多态
- 运行时和常见面试题目
- 面试题28:字符串的排列
- 百度面试
- 面试题 10