一个数组,长度为11,任意5个相加等于35,要求5个元素不能相连 一个数组,int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 长度为11,任意5个相加等于35,要求5元素不能相连。如:1,2,3,4,5 这5个相连了(不行哦),求出所有的组合?我用二次循环还是写不出,关键是5元素不能相连不知道怎么写,想很久了,没思路。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 设置标志位,第一个和第二个之间设置一个(因为元素是有序的,你可以从小到大或者从大到小选取),第二个和第三个设置一个,依次类推 boolean b[4];当第一个与第二个相连(其实也就是(a[2]-a[1])==1),那么设置b[0] = true;当第二个与第三个相连,那么设置b[1] = true;依次类推 等最后结果出来时,判断该组合的b[0] & b[1] & b[2] & b[3]的结果,如果为true则将该结果抛弃。 用二次循环可以啊,每个循环里面先判断一下是不是相连,如果相连则直接continue,否则再判断相加结果,这样应该可以。 public class Test { public static void main(String[] args) { int[] a= {1,2,3,4,5,6,7,8,9,10,11}; for(int i=0;i<a.length-4;i++){ for(int j=i+1;j<a.length-3;j++) for(int k=j+1;k<a.length-2;k++) for(int l=k+1;l<a.length-1;l++) for(int m=l+1;m<a.length;m++){ if(a[i]+a[j]+a[k]+a[l]+a[m]==35){ if(!(j-i==1&&k-j==1&&l-k==1&&m-l==1)) System.out.println(a[i]+" "+a[j]+" "+a[k]+" "+a[l]+" "+a[m]); } } } }} 假设b[5]数组表示数在a数组坐标,不连续的充要条件为 b[4]-b[0] != 4 前提 a 和 b都是有序的 一个数组,int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 长度为11,任意5个相加等于35你这题就有毛病,1,2,3,4,6相加也不等于35啊。你还是想说任意5个数步相连,连续的5个数相加等于35?错题,无解!要是你自己想的就想明白再发帖 如果是要在已知的数据中找到这样的5个数,不知我下边的建议有用没,上班中,无法给你提供代码,只能给点思路了:判断 a[0] + a[1] + a[2] + a[3] + a[11] 的值是否大于35 如果是就必须要将 a[11]往前退一位了,以此类推。找到最大的数后开始判断之前的4个数,a[3]往后进一位成a[4] 判断5个数和是否小于35 小于的话,a[3]退回去把a[2]换成a[4]再判断下。如果一直到a[0]换成a[4]还是小了的话,就将a[3]换成a[5]继续这样判断;中间具体的移位换数楼主自己可以再琢磨下。不多说了 呵呵上班偷着回帖,实在没时间给写代码4 楼的代码太暴力了 本题中是11个数好点 换成N 的话 时间复杂度就是O(N^5)了 关于InvocationHandler,请路过的同仁帮忙解释一下! 请教 边缘点的判断问题 一个正则表达式的问题 java初学者 提问 一个简单的程序 如何得到文件属性,如:文件创建时间,文件大小等 log4j的一个问题```` JPasswordField 的提取字符串 我有关于多线程问题,苦恼了一天了没有解决,请大牛帮忙 jbuilder7.0中,如何调试apleet? JavaSE问题 Java正则表达式"句号"问题 log4j如何配置根据线程生成log文件
当第一个与第二个相连(其实也就是(a[2]-a[1])==1),那么设置b[0] = true;
当第二个与第三个相连,那么设置b[1] = true;
依次类推 等最后结果出来时,判断该组合的b[0] & b[1] & b[2] & b[3]的结果,如果为true则将该结果抛弃。
public static void main(String[] args) {
int[] a= {1,2,3,4,5,6,7,8,9,10,11};
for(int i=0;i<a.length-4;i++){
for(int j=i+1;j<a.length-3;j++)
for(int k=j+1;k<a.length-2;k++)
for(int l=k+1;l<a.length-1;l++)
for(int m=l+1;m<a.length;m++){
if(a[i]+a[j]+a[k]+a[l]+a[m]==35){
if(!(j-i==1&&k-j==1&&l-k==1&&m-l==1))
System.out.println(a[i]+" "+a[j]+" "+a[k]+" "+a[l]+" "+a[m]);
}
}
}
}
}
你这题就有毛病,1,2,3,4,6相加也不等于35啊。你还是想说任意5个数步相连,连续的5个数相加等于35?
错题,无解!要是你自己想的就想明白再发帖
判断 a[0] + a[1] + a[2] + a[3] + a[11] 的值是否大于35 如果是就必须要将 a[11]往前退一位了,以此类推。
找到最大的数后开始判断之前的4个数,a[3]往后进一位成a[4] 判断5个数和是否小于35 小于的话,a[3]退回去把a[2]换成a[4]再判断下。如果一直到a[0]换成a[4]还是小了的话,就将a[3]换成a[5]继续这样判断;中间具体的移位换数楼主自己可以再琢磨下。不多说了 呵呵
上班偷着回帖,实在没时间给写代码
4 楼的代码太暴力了 本题中是11个数好点 换成N 的话 时间复杂度就是O(N^5)了