数组中重复的数字
2018-03-17 21:20
204 查看
1.字符串的做法
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
StringBuffer sb=new StringBuffer();
for(int i=0;i<length;i++) {
sb.append(numbers[i]+"");
}
for(int j=0;j<length;j++) {
if(sb.indexOf(numbers[j]+"")!=sb.lastIndexOf(numbers[j]+"")) {
duplication[0]=numbers[j];
return true;
}
}
return false;
}
}
2. 排序+扫描O(nlogn),Arrays.sort()对于基本数据类型是快速排序,对对象类型是优化后的归并排序
因此排序的时间复杂度是O(nlogn)
import java.util.Arrays;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
Arrays.sort(numbers);
for(int i=1;i<numbers.length;i++){
if(numbers[i-1]==numbers[i]){
duplication[0]=numbers[i];
return true;
}
}
return false;
}
}
3. 哈希表:时间复杂度O(n) 空间复杂度O(n) 判断哈希表中是否包含O(1)
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
HashSet<Integer> set=new HashSet<Integer>();
for(int i=0;i<numbers.length;i++){
if(set.contains(numbers[i])){
duplication[0]=numbers[i];
return true;
}else{
set.add(numbers[i]);
}
}
return false;
}
}
4.挖掘数组特点,时间复杂度O(n),空间复杂度O(1),每个数组最多只要交换两次就能找到属于它自己的位置,且不需要额外分配空间,因为所有的操作都是在输入数组上进行的,这里带来的影响是对输入数组进行了修改,这个不一定是可以的,需要问面试官。
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
for(int i=0;i<numbers.length;i++){
while(numbers[i]!=i){
if(numbers[numbers[i]]!=numbers[i]){
int temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}else{
duplication[0]=numbers[i];
return true;
}
}
}
return false;
}
}
将交换数组中两个位置的代码写成了一个函数的情况,更简洁和直观。
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
for(int i=0;i<numbers.length;i++){
while(numbers[i]!=i){
if(numbers[numbers[i]]!=numbers[i]){
swap(numbers,i,numbers[i]);
}else{
duplication[0]=numbers[i];
return true;
}
}
}
return false;
}
public void swap(int[] array,int m,int n){
int temp=array[m];
array[m]=array
;
array
=temp;
}
}
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
StringBuffer sb=new StringBuffer();
for(int i=0;i<length;i++) {
sb.append(numbers[i]+"");
}
for(int j=0;j<length;j++) {
if(sb.indexOf(numbers[j]+"")!=sb.lastIndexOf(numbers[j]+"")) {
duplication[0]=numbers[j];
return true;
}
}
return false;
}
}
2. 排序+扫描O(nlogn),Arrays.sort()对于基本数据类型是快速排序,对对象类型是优化后的归并排序
因此排序的时间复杂度是O(nlogn)
import java.util.Arrays;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
Arrays.sort(numbers);
for(int i=1;i<numbers.length;i++){
if(numbers[i-1]==numbers[i]){
duplication[0]=numbers[i];
return true;
}
}
return false;
}
}
3. 哈希表:时间复杂度O(n) 空间复杂度O(n) 判断哈希表中是否包含O(1)
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
HashSet<Integer> set=new HashSet<Integer>();
for(int i=0;i<numbers.length;i++){
if(set.contains(numbers[i])){
duplication[0]=numbers[i];
return true;
}else{
set.add(numbers[i]);
}
}
return false;
}
}
4.挖掘数组特点,时间复杂度O(n),空间复杂度O(1),每个数组最多只要交换两次就能找到属于它自己的位置,且不需要额外分配空间,因为所有的操作都是在输入数组上进行的,这里带来的影响是对输入数组进行了修改,这个不一定是可以的,需要问面试官。
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
for(int i=0;i<numbers.length;i++){
while(numbers[i]!=i){
if(numbers[numbers[i]]!=numbers[i]){
int temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}else{
duplication[0]=numbers[i];
return true;
}
}
}
return false;
}
}
将交换数组中两个位置的代码写成了一个函数的情况,更简洁和直观。
import java.util.*;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null || numbers.length==0) return false;
for(int i=0;i<numbers.length;i++){
while(numbers[i]!=i){
if(numbers[numbers[i]]!=numbers[i]){
swap(numbers,i,numbers[i]);
}else{
duplication[0]=numbers[i];
return true;
}
}
}
return false;
}
public void swap(int[] array,int m,int n){
int temp=array[m];
array[m]=array
;
array
=temp;
}
}
相关文章推荐
- 编写一个javscript函数 fn,该函数有一个参数 n(数字类型),其返回值是一个数组,该数组内是 n 个随机且不重复的整数,且整数取值范围是 [2, 32]。
- 《剑指offer》刷题笔记(数组):数组中重复的数字
- 数组中重复的数字:hash表-->unordered_map<>
- 数组中找重复的数字
- 数组中重复的数字
- (六)一个判断整形数组中是否有重复数字的简单算法
- 数组中重复的数字(数组)
- lintcode-101-删除排序数组中的重复数字 II
- 计蒜客-第22题:排序后的数组删除重复数字
- for循环的小练习之产生不重复数字的整型数组
- 数组中重复的数字
- 50、数组中重复的数字
- 列出一个数组里面的重复数字
- C/C++面试之算法系列--去除数组中的重复数字
- LintCode(100)删除排序数组中的重复数字
- 删除数组中的重复数字I
- 剑指offer(数组中重复的数字,二维数组中的查找)
- 算法面试题之数组中重复的数字
- 数组中的重复(缺失)数字 剑指offer3 及扩展
- 剑指offer:数组中重复的数字