面试题:和为s的数字
题目一:在一个递增排序的数组中,找到任意一对和为s的数字
题目二:输入一个正数,打印出所有和为s的连续正数序列(至少含两个数)
如输入15,输出1~5,4~6和7~8
思路:
题目一:
先再数组中选择两个数字,如果它们的和等于s,则就是我们要找的数字。
如果和<s,则说明需要两个数的和更大一些,又因为数组是递增的,因此我们可以选择将较小数替换为当前较小数后面的那个数。
如果和>s,则说明需要两个数的和更小一些,又因为数组是递增的,因此我们可以选择将较大数替换为当前较大数前面的那个数。
题目二:
思路同题目一
从0和1开始,start=0,end=1,sum=start累加到end
如果从start累加到end的和等于s,则将start到end打印出来
如果从start累加到end的和小于s,则将end++,并将新的end加入到sum中去(将较大值替换为较大值后面的数,并将新数加到sum中来)
如果从start累加到end的和大于s,则将sum中减去当前的start,并将start++(减去旧值,并将较小值替换为较小值后面的数)
一直到end<=(s/2)+1 ——因为要求是连续的,所以当end大于(s/2)+1后,已经不能找到符合条件的连续数
代码
题目一:
public class Q57_1 {
public static void main(String[] args) {
int[] a = new int[]{1,2,4,7,11,15};
int[] re = finds(a,15);
System.out.printf("%d %d", re[0],re[1]);
}
public static int[] finds(int[] a,int s) {
int start = 0;
int end = a.length-1;
int[] re = new int[] {-1,-1};
if(end<0) {
System.out.println("wrong input");
return re;
}
while(start<end) {
if(a[start]+a[end]==s) {
re[0] = a[start];
re[1] = a[end];
return re;
}
if(a[start] + a[end] > s) {
end--;
}else {
start++;
}
}
System.out.println("no such pair");
return re;
}
}
题目二:
public class Q57_2 {
public static void main(String[] args) {
printSum(15);
}
public static void printSum(int s) {
int start = 0;
int end = 1;
int sum = start + end;
int flag = 0;
while(end<=(s/2)+1) {
if(sum==s && start<end) {
flag = 1;
printTwo(start, end);
end++;
sum = sum + end;
}
if(sum<s) {
end++;
sum = sum + end;
}else {
sum = sum - start;
start++;
}
}
if(flag==0) {
System.out.println("no such list");
}
}
public static void printTwo(int start,int end) {
for(int i = start; i <= end; i++) {
System.out.print(i);
}
System.out.println();
}
}