code(04)

     一、把只包含因子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;
	    }
	  

       

      

         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值