一、把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
方法一:常规想法,从1开始挨个判断下一个是不是丑数,丑数的判断标准:整除2整除3整除5 之后最后为1
方法二:进行优化过后,每一个丑数都是由之前的某一个丑数*2或3或5得到,所以找到前一个乘以2 3 5之后恰好大于现在最大丑数的最小值,然后将之前那个下标+1即可。
public int GetUglyNumber_Solution(int index) {
if(index<=0)
return 0;
int[] arr=new int[index];
arr[0]=1;
int index2=0;
int index3=0;
int index5=0;
for(int i=1;i<index;i++){
int min=Math.min(arr[index2]*2, Math.min(arr[index3]*3, arr[index5]*5));
arr[i]=min;
if(min==arr[index2]*2)
index2++;
if(min==arr[index3]*3)
index3++;
if(min==arr[index5]*5)
index5++;
}
return arr[index-1];
}
二、输入一个递增排序的数组和一个数字sum,在数组中查找两个数,使得他们的和正好是s,并且乘积最小
方法:设两个指针start、end,一个从头开始一个从末尾开始,如果和等于sum输出,如果小于,start++,大于,end--
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list=new ArrayList();
if(array==null)
return list;
int start=0,end=array.length-1;
while(start<end){
if(array[start]+array[end]==sum){
list.add(array[start]);
list.add(array[end]);
return list;
}
else if(array[start]+array[end]>sum)
end--;
else
start++;
}
return list;//出了while循环之后就是代表没有找到这样的两个数,这时list里面没有值
}
三、输入一个正数s,打印出所有和为sum的连续正数序列(至少含有两个数)。例如输入15,打印3个连续序列 1-5,4-6和7-8.
方法:start初始化为1,end初始化为2,如果从start到end的和,大于sum的话start++,小于sum的话end++,等于的话存好,然后继续end++向后扩张
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> result=new ArrayList();
if(sum<3)
return result;
int start=1,end=2;
int tmpSum=start+end;
while(start<=(1+sum)/2){
if(tmpSum==sum){
ArrayList<Integer> list=new ArrayList();
for(int i=start;i<=end;i++)
list.add(i);
result.add(list);
end++;
tmpSum+=end;
}
else if(tmpSum<sum){
end++;
tmpSum+=end;
}
else{
tmpSum-=start;
start++;
}
}
return result;
}