问题的三种情况分析及代码实现——JAVA实现
目录
问题二:一个连续数组中,其中n-1个正整数出现了偶数次,一个数出现了奇数次,请找出这个奇数次的正整数。
问题三:一个连续数组中,其中n-2个正整数出现了偶数次,两个数出现了奇数次,请找出这两个奇数次的正整数。
问题一:连续数组中找到缺失的那个整数问题
简单思路——先求和,再减法。
//寻找缺失的整数问题
public class LostNumber {
//在一个连续的整数数组中寻找缺失的整数问题1——缺失一个整数
//思路:先求和再利用减法运算进行查找——>假设数组中连续两个整数步长为1
public static int findLostNumber(int[] nums) {
int losttarget=0;
int n=nums.length;
//寻找数组中的最大和最小值
int nummax=0;
int nummin=nums[0];
for(int i=0; i<n; i++) {
nummax=nummax>nums[i]?nummax:nums[i];
nummin=nummin<nums[i]?nummin:nums[i];
}
//求和运算
int sum=(n+1)*(nummin+nummax)/2;
//差值运算
for(int i=0; i<n; i++) {
sum=sum-nums[i];
}
losttarget=sum;
return losttarget;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums=new int[] {1,3,4,2,10,6,7,8,9};
int losttarget=findLostNumber(nums);
System.out.println(losttarget);
}
}
问题二:一个连续数组中,其中n-1个正整数出现了偶数次,一个数出现了奇数次,请找出这个奇数次的正整数。
简单思路——运用二进制的异或操作完成。
//寻找连续数组中缺失的整数二
//一个连续数组中,其中n-1个正整数出现了偶数次,一个数出现了奇数次,请找出这个奇数次的正整数
//思路:运用二进制的 异或^ 运算,根据异或运算规则——> 0^1=1 1^1=0 0^0=0 ,运算结果即为所求。
public class LostNumberTwo {
public static int findLostNumber(int[] nums) {
int losttarget=nums[0];
int n=nums.length;
for(int i=1; i<n; i++) {
losttarget=losttarget^nums[i];
}
return losttarget;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums=new int[] {2,2,3,4,5,5,1,3,1};
int losttarget=findLostNumber(nums);
System.out.println(losttarget);
}
}
问题三:一个连续数组中,其中n-2个正整数出现了偶数次,两个数出现了奇数次,请找出这两个奇数次的正整数。
简单思路——运用分治法,利用异或运算,先找数组的分界标志数,再分组进行异或运算即可。
import java.util.Arrays;
//一个连续数组中,其中n-2个正整数出现了偶数次,两个数出现了奇数次,请找出这两个奇数次的正整数
/*
* 思路——分治法:
* 1、借助整个正整数数组的异或结果--->其实就是两个奇数次整数的异或结果,即 奇数-->A,和奇数-->B, aorb=A^B
* 2、找到这个结果-->aorb 的二进制数的从右往左第一个1,用separator表示这个标志数
* 3、利用这个标志数separator对原数组进行分组-->一部分含有奇数次的A,另一部分含有奇数次的B(分治法的思想)
* 4、将问题转化成在一个数组中求一个奇数次的整数的问题
*/
public class LostNumberThree {
public static int[] findLostNumbers(int[] nums) {
int losttarget[]=new int[2];
int n=nums.length;
//整个数组异或运算一边,计算A与B的异或结果
int aorb=0;
for(int i=0; i<n; i++) {
aorb=aorb^nums[i];
}
//寻找aorb中从右往左第一个1的位置,作为分隔标志数separator
int separator=1;
while((aorb&separator)==0) {
separator=separator<<1;
}
//利用separator对原数组中的数据进行分类————> separator&nums[i]==0一类,separator&nums[i]==1一类
//二进制--> 与 运算分类;异或 运算求解。
for(int i=0; i<n; i++) {
if((separator&nums[i])==0) {
losttarget[0]=losttarget[0]^nums[i];
}
else
{
losttarget[1]=losttarget[1]^nums[i];
}
}
return losttarget;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums=new int[] {2,6,9,7,11,6,2,9,11,8,10,10};
System.out.println(Arrays.toString(findLostNumbers(nums)));
}
}