数组中只出现一次的数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字。
0异或任何数等于任何数,同一个数异或结果为零。
利用这一定律,将所有数字异或一次,得到的结果就是两个只出现一次的数字的异或,利用flag标志找出两个数字不同的那一位,然后利用那一位找出两个只出现一次的数字。
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array.length < 2) return ;
int myxor = 0;
int flag = 1;
for(int i = 0 ; i < array.length; ++ i )
myxor ^= array[i];
while((myxor & flag) == 0) flag <<= 1;
// num1[0] = myxor;
//num2[0] = myxor;
for(int i = 0; i < array.length; ++ i ){
if((flag & array[i]) == 0) num2[0]^= array[i];
else num1[0]^= array[i];
}
}
}
和为S的连续正数序列
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。
利用简单的循环遍历方法,循环到sum/2即可,当count>sum时,则跳出循环,减少循环次数,提高效率。
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> aList=new ArrayList<ArrayList<Integer>>();
if(sum<2)
return aList;
for(int i=1;i<=sum/2;i++){
ArrayList<Integer> aList2=new ArrayList<Integer>();
int count=0;
for(int j=i;j<sum;j++){
count+=j;
aList2.add(j);
if(count>sum)
break;
else if(count==sum){
aList.add(aList2);
break;
}
}
}
return aList;
}
}
和为S的两个数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
乘积最小是一个尽量大,一个尽量小的组合。
所以从两端开始向中间寻找。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> result=new ArrayList<Integer>();
int length=array.length;
int i=0,j=length-1;
while(i<=j){
if(array[i]+array[j]<sum){
i++;
continue;
}
if(array[i]+array[j]>sum){
j--;
continue;
}
if(sum==(array[i]+array[j])){
result.add(array[i]);
result.add(array[j]);
return result;
}
}
return result;
}
}