2019.2.17 《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门
这道题有两种思路,一个思路是利用HashMap,判断重复问题肯定优先想到HashMap,从第一个数字开始依次存入HashMap里,一旦出现重复可以直接输出;另一个思路是利用题目条件,题目特地说了“所有数字都在0到n-1的范围内”,那么可以创建一个长度为n的数组,用来模拟HashMap的操作。
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
Java实现:
/**
*
* @author ChopinXBP
* 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。
* 请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
*
*/
import java.util.HashMap;
public class Duplicate_49 {
public static int duplication[] = {0};
public static void main(String[] args) {
// TODO Auto-generated method stub
int numbers[] = {2,3,1,0,2,5,3};
int length = 7;
System.out.println(duplicate(numbers, length, duplication));
System.out.println(duplicate2(numbers, length, duplication));
}
//利用Hashmap
public static boolean duplicate(int numbers[],int length,int [] duplication) {
if(length <= 0 || numbers == null)return false;
HashMap<Integer, Boolean> nums = new HashMap<>();
for(int i = 0; i < length; i++) {
if(nums.containsKey(numbers[i])) {
duplication[0] = numbers[i];
return true;
}else {
nums.put(numbers[i], false);
}
}
return false;
}
//利用题目条件:所有数字都在1-length范围内
public static boolean duplicate2(int numbers[],int length,int [] duplication) {
if(length <= 0 || numbers == null)return false;
boolean[] judge = new boolean[length];
for(int i = 0; i < length; i++) {
if(judge[numbers[i]] == true) {
duplication[0] = numbers[i];
return true;
}else {
judge[numbers[i]] = true;
}
}
return false;
}
}
C++实现示例:
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
if(numbers==NULL||length==0) return 0;
int hashTable[255]={0};
for(int i=0;i<length;i++)
{
hashTable[numbers[i]]++;
}
int count=0;
for(int i=0;i<length;i++)
{
if(hashTable[numbers[i]]>1)
{
duplication[count++]=numbers[i];
//break;
return true;
}
}
return false;
}
};
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#