剑指offer:数组中重复的数字
来源:互联网 发布:《大数据思维与决策》 编辑:程序博客网 时间:2024/06/05 01:17
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
1.暴力求解
思路:利用两个for循环从前往后直接遍历,找到后存到duplication数组中,然后返回true,否则返回false.
public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number,length of duplication array is 1, // so using duplication[0] = ? in implementation; // Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++ // 这里要特别注意~返回任意重复的一个,赋值duplication[0] // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false public boolean duplicate(int numbers[],int length,int [] duplication) { for(int i=0;i<length;i++){ for(int j=i+1;j<length;j++){ if(numbers[i]==numbers[j]){ duplication[0]=numbers[i]; return true; } } } return false; }}
2.用contains方法来做一个是否包含的判断
import java.util.*;public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation; // Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++ // 这里要特别注意~返回任意重复的一个,赋值duplication[0] // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false public boolean duplicate(int numbers[],int length,int [] duplication) { ArrayList<Integer> list=new ArrayList<Integer>(); for(int i=0;i<length;i++){ if(list.contains(numbers[i])){ duplication[0]=numbers[i]; return true; }else{ list.add(numbers[i]); } } return false; }}
3.用HashSet的add方法返回true或者false来判断
思路:如果set中没有这个元素,那么set添加进去则会返回true。否则如果set里面包含这个元素,则在添加的时候会返回一个false;
import java.util.*;public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation; // Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++ // 这里要特别注意~返回任意重复的一个,赋值duplication[0] // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false public boolean duplicate(int numbers[],int length,int [] duplication) { HashSet<Integer> set=new HashSet<Integer>(); for(int i=0;i<length;i++){ boolean flag=set.add(numbers[i]); if(!flag){ duplication[0]=numbers[i]; return true; } } return false; }}
4.用StringBuffer的indexOf和lastIndexOf方法
思路:indexOf和lastIndexOf分别返回sb中同一个字符第一次和最后一次出现的位置,如果不相同,那么即为重复。
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 i=0;i<length;i++){ if(sb.indexOf(numbers[i]+"")!=sb.lastIndexOf(numbers[i]+"")){ duplication[0]=numbers[i]; return true; } } return false; }
5.标记
思路:网友提供了一个遍历后标记的方法
public boolean duplicate(int numbers[], int length, int[] duplication) { boolean[] k = new boolean[length]; for (int i = 0; i < k.length; i++) { if (k[numbers[i]] == true) { duplication[0] = numbers[i]; return true; } k[numbers[i]] = true; } return false; }
阅读全文
0 0
- 剑指offer--数组中重复的数字
- 《剑指offer》数组中重复的数字
- 剑指offer:数组中重复的数字
- [剑指Offer]数组中重复的数字
- 剑指offer:数组中重复的数字
- 剑指offer 数组中重复的数字
- [剑指offer]数组中重复的数字
- 剑指offer|数组中重复的数字
- 剑指offer-数组中重复的数字
- 剑指offer 数组中重复的数字
- 《剑指offer》数组中重复的数字
- 剑指offer-数组中重复的数字
- 剑指offer--数组中重复的数字
- 剑指offer--数组中重复的数字
- 剑指offer:数组中重复的数字
- 剑指offer:数组中重复的数字
- 剑指offer:数组中重复的数字
- 【剑指offer】数组中重复的数字
- 网络流24题-4
- 最短路算法
- Docker私有仓库搭建
- SpringAop--切面实例
- 递推和递归一
- 剑指offer:数组中重复的数字
- 用两个栈实现队列java实现
- yum 和 rpm安装mysql彻底删除
- JAVA对象的创建过程
- [LeetCode] 3Sum的O(N^2)解法
- R:绘图——药物剂量水平的响应情况
- 取石子(一)-OJ
- Ajax
- codevs 1036 商务旅行 LCA 解题报告