给定一个数列{1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,18,32,56,85},用最快的效率找到所有的 2 个数字相加等于 27 的数对,并输出;
解决方案 »
- 请英语好的朋友 看下这道题目好么? 顺便翻译一下啦 谢谢
- 请问高手,JMenuItem中怎样设置一个键为快捷键啊,比如F2,delete,望指教!
- 16进制的能转化为int型或long型吗?
- 请教,用swing类编写的界面如何在网页上显示运行?
- 关于MICROSOFT OFFICE 的问题
- 急问:如何判断给定的pathname中路径名是否存在?即如何判断文件夹是否存在呢?
- 为什么要多一个readLine()???
- jbuilder
- 怎样把整张网页内容当作一副图形(只能作为图像,因为可能网页中有图)传给控制打印的Java程序?
- 我装了james(邮件服务器....)时,运行时发生问题,请教??高手
- System.out.print编码问题
- 问一SQL语句
public static void main(String args[]) {
int[] i = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 17, 18, 32,
56, 85 };
for (int m = 0; i[m] <= 13; m++) {
for (int n = m; i[n] < 27; n++) {
if (i[m] + i[n] == 27) {
System.out.println(i[m] + "+" + i[n] + "=" + 27);
} }
}
}
}
public class Test{
private int[] nums;
private int m;
public Test(int[] nums, int m){
this.nums = nums;
this.m = m;
}
public void getNums(){
int first = 0;
int second = nums.length - 1;
int temp = 0;
while(first < second){
if(nums[first] + nums[second] == m){
System.out.println("nums[" + first + "] + nums[" + second] + "==" + m);
temp++ ;
}else if(nums[first] + nums[second] > m){
second-- ;
}else{
first++ ;
}
}
System.out.println("符合条件的数对有" + temp + "对!");
}
public static void main(){
int[] a = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,18,32,56,85};
int m = 27;
Test test = new Test(a,m);
test.getNums();
}
}
2.判断:
while(true){
while(min+max>27){max--;}
while(min+max<27){min++;}
if(min+max==27) return min,max;
}欧了
@author 王平
2010-2-1
*/
public class SearchPairNumber { /**
* @param args
*/
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,18,32,56,85};
List<Integer> allNums = new ArrayList<Integer>();
for (int a : nums) {
if (a <= 27) {
allNums.add(a);
}
}//end for
searchPair(allNums);
}//end main
private static void searchPair(List<Integer> allNums) {
int first = 0;
int second = 0;
while (allNums.size() > 0) {
first = allNums.get(0);
for (int i=1; i<allNums.size(); i++) {
if (first + allNums.get(i) == 27) {
second = allNums.get(i);
System.out.println("first:" + first + " \tsecond:" + second);
allNums.remove(i);
break;
}
}
allNums.remove(0);
}
}}测试结果:
first:9 second:18
first:10 second:17
first:12 second:15
main {
for(int i=0; a[i] < N; i++) {
if(findNum(N-a[i])) {
System.out.println(a[i], N-a[i]);
//这样的组合对肯能有重复,在if外层做重复控制
//(12, 15)和(15,12)是同一组
}
}
}public boolean findNum(int[] a, int b) {
....
二分查找
存在返回返回true/不存在返回false;
....
}
应该为 for (int m = 0; m <= 13; m++) 吧 呵呵
你那个时间复杂度太高了基本为O(n^2);
27/2=13.5 定位到[14]
从[14]开始往后遍历找a
若a比27小,则从[14]往前遍历找b 若b>27-a,继续
若b<27-a,停止当前循环
若b== 27-a,输出 a,b,停止当前循环
若a比27大,则跳出,程序终止。
2、main方法写错
3、死循环
编译是哪出问题了
不可能出死循环啊
for (int m = 0; i[m] <= 13; m++) {
for (int n = m; i[n] < 27; n++) {
楼主给的例子比较简单,如果给的数是最后2个加起来是给定数的话,你算算你的数要跑多少遍。
if(nums[first] + nums[second] == m){
System.out.println("nums[" + first + "] + nums[" + second] + "==" + m);
temp++ ;
}
打印字符串参数的时候笔误了
就temp++ first second都不变当然要死循环
看样子要加下
if(nums[first] + nums[second] == m){
System.out.println("nums[" + first + "] + nums[" + second] + "==" + m);
temp++ ;
first++;
}
这样应该是不会有问题了
int i =0, j = 99;fo(i <= 99 and j >= 0 and i < j){
if((a[i] + a[j]) = 27){
System.out.println(a[i] + "," + a[j]) ;
j--;
}
if((a[i] + a[j]) > 27){
j-- ;
}
else {
if((a[i] + a[j]) < 27){
i++;
}
}
}
public class Test{
private int[] nums;
private int m;
public Test(int[] nums, int m){
this.nums = nums;
this.m = m;
}
public void getNums(){
int first = 0;
int second = nums.length - 1;
int temp = 0;
while(first < second){
if(nums[first] + nums[second] == m){
System.out.println("nums[" + first + "] + nums[" + second + "] =" + m);
temp++ ;
first++ ;
}else if(nums[first] + nums[second] > m){
second-- ;
}else{
first++ ;
}
}
System.out.println("符合条件的数对有" + temp + "对!");
}
public static void main(String[] args){
int[] a = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,18,32,56,85};
int m = 27;
Test test = new Test(a,m);
test.getNums();
}
}
写出来比较简单,但是思想需要研究一下,要想最快还需要这样做。 1、给出一个数组 但并不知道它的内容a[100],这时需要排序; 2、排序完成后,取数组的第一个和最后一个进行相加,加过的从最大的往最小的剔除数组的内容,依次进行剔除同时输出符合结果的数对。
int i =0, j = 99; for (i <= 99 and j >= 0 and i < j){
if((a[i] + a[j]) = 27){
System.out.println(a[i] + "," + a[j]) ;
j--;
}
if((a[i] + a[j]) > 27){
j-- ;
}
else {
if((a[i] + a[j]) < 27){
i++;
}
}
}
int i =0, j = 99; for (i <= 99 and j >= 0 and i < j){
if((a[i] + a[j]) = 27){
System.out.println(a[i] + "," + a[j]) ;
j--;
} else{
if((a[i] + a[j]) > 27){
j-- ;
}
else {
if((a[i] + a[j]) < 27){
i++;
}
}
}}
* 给定一个数列{1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,18,32,56,85},
* 用最快的效率找到所有的 2 个数字相加等于 27 的数对,并输出;
* @author HouLei
*/
public class SearchPairNumber { public static void main(String[] args) {
int arr [] = new int []{1,2,3,4,5,6,7,8,9,10,11,12,14,15,17,18,32,56,85};
int sum = 27;
printPairNumber(arr,sum);
} private static void printPairNumber(int[] arr , int sum) {
int start = 0 , end = arr.length-1;
Arrays.sort(arr);
for(int i = end ; arr[i]>sum;i--)end = i-1;
for(int i = 0 ;arr[i]+arr[end]<sum;i++)start = i+1;
_printPairNumber(arr,sum,start,end);
} private static void _printPairNumber(int[] arr, int sum, int start, int end) {
if(start>end)return;
int s = arr[start]+arr[end];
if(s<sum)_printPairNumber(arr,sum,start+1,end);
if(s>sum)_printPairNumber(arr,sum,start,end-1);
if(s==sum){
System.out.println("Pair Number : "+arr[start]+" \t"+arr[end]);
_printPairNumber(arr,sum,start+1,end-1);
}
}}