题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

       例如输入数组{1,2,4,7,11,15}和数字15。由于4+11=15,因此输出4和11。

     定义两个变量(指针),分别保存数组的开始元素和结尾元素,根据两变量和与目标值进行比较,改变变量的值,重复上一步的操作。

代码实现:

public class Solution{
      public static boolean findNumbersWithSum(int[] data,int sum,int[] number){
            boolean found=false;
            if(data==null||data.length<2){
                 return found;
            }
            int ahead=0;
            int behind=data.length-1;
            while(ahead<behind){
                long curSum=data[ahead]+data[behind];
                if(curSum==sum){
                     number[0]=data[ahead];
                     number[1]=data[behind];
                     found=true;
                     return found;
                }else if(curSum>sum){
                     behind--;
                }else{
                     ahead++;
                }
            }
            return found;
      }

      public static void main(String[] args){
            int[] numbers={1,2,4,7,11,15};
            int[] num=new int[2];
            boolean found=findNumbersWithSum(numbers,15,num);
            if(found){
                for(int i:num){
                    System.out.print(i+" ");
                }
            }else{
                    System.out.println("not exists");
            }
     }
}

        题目二:输入一个正数s,打印出所有和为s的连续正数系列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6和7~8。

       考虑用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于s,那么从序列中去掉较小的值,也就是增大small的值,如果从small到big的序列的和小于s,那么可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,那么small一直增加到(1+s)/2为止。

代码实现:

public class Solution{
     public static void findContinuousSequence(int sum){
          if(sum<3){
               return;
          }
          int small=1;
          int big=2;
          int curSum=small+big;
          int middle=(1+sum)/2;
          while(small<middle){
               if(curSum==sum){
                    printContinuousSequence(small,big);
               }
               while(curSum>sum){
                    curSum-=small;
                    small++;
                    if(curSum==sum){
                        printContinuousSequence(small,big); 
                    }
                }
                big++;
                curSum+=big;
          }
     }

     public static void printContinuousSequence(int small,int big){
          for(int i=small;i<=big;i++){
               System.out.print(i+" ");
          }
          System.out.println();
     }

     public static void main(String[] args){
          findContinuousSequence(9);
     }
}

 

 posted on 2018-11-27 21:07  会飞的金鱼  阅读(131)  评论(0)    收藏  举报