Java 我的Havel Hakimi算法代码有什么问题?
我试图练习我的编码技巧,我在Dailyprogrammer Reddit上找到了一个使用Havel Hakimi算法()的编码练习,但它总是返回错误的布尔值Java 我的Havel Hakimi算法代码有什么问题?,java,algorithm,Java,Algorithm,我试图练习我的编码技巧,我在Dailyprogrammer Reddit上找到了一个使用Havel Hakimi算法()的编码练习,但它总是返回错误的布尔值 public static void main(String[] args) { int[] answer = {16, 9, 9, 15, 9, 7, 9, 11, 17, 11, 4, 9, 12, 14, 14, 12, 17, 0, 3, 16}; System.out.println(hh(answer));
public static void main(String[] args) {
int[] answer = {16, 9, 9, 15, 9, 7, 9, 11, 17, 11, 4, 9, 12, 14, 14, 12, 17, 0, 3, 16};
System.out.println(hh(answer));
ArrayList<Integer> temp = new ArrayList<Integer>();
System.out.println(temp.size());
}
//This is the actual Havel-Hakimi Algorithm Method
public static boolean hh(int[] answer) {
ArrayList<Integer> temp = new ArrayList<Integer>();
int n;
for(int i = 0; i < answer.length; i++) {
temp.add(answer[i]);
}
for(int j = 0; j < temp.size(); j++) {
if(temp.get(j) == 0)
temp.remove(j);
}
if(temp.size() == 0) {
return true;
}
Collections.sort(temp);
for(int t = 0; t < temp.size(); t++) {
}
n = temp.get(0);
temp.remove(0);
if(n > temp.size()) {
return false;
}
for(int k = 0; k < n; k++) {
temp.set(k, temp.get(k) - 1);
}
int[] newAnswer = new int[temp.size()];;
for(int l = 0; l < temp.size(); l++) {
newAnswer[l] = temp.get(l);
}
return hh(newAnswer);
}
我试图在每个循环中检查我的进程,以确保所有方法都做了正确的工作,并且输出是我所期望的,但它总是返回错误的布尔值
public static void main(String[] args) {
int[] answer = {16, 9, 9, 15, 9, 7, 9, 11, 17, 11, 4, 9, 12, 14, 14, 12, 17, 0, 3, 16};
System.out.println(hh(answer));
ArrayList<Integer> temp = new ArrayList<Integer>();
System.out.println(temp.size());
}
//This is the actual Havel-Hakimi Algorithm Method
public static boolean hh(int[] answer) {
ArrayList<Integer> temp = new ArrayList<Integer>();
int n;
for(int i = 0; i < answer.length; i++) {
temp.add(answer[i]);
}
for(int j = 0; j < temp.size(); j++) {
if(temp.get(j) == 0)
temp.remove(j);
}
if(temp.size() == 0) {
return true;
}
Collections.sort(temp);
for(int t = 0; t < temp.size(); t++) {
}
n = temp.get(0);
temp.remove(0);
if(n > temp.size()) {
return false;
}
for(int k = 0; k < n; k++) {
temp.set(k, temp.get(k) - 1);
}
int[] newAnswer = new int[temp.size()];;
for(int l = 0; l < temp.size(); l++) {
newAnswer[l] = temp.get(l);
}
return hh(newAnswer);
}
publicstaticvoidmain(字符串[]args){
int[]答案={16,9,9,15,9,7,9,11,17,11,4,9,12,14,14,12,17,0,3,16};
系统输出打印LN(hh(答案));
ArrayList temp=新的ArrayList();
System.out.println(temp.size());
}
//这是实际的Havel Hakimi算法
公共静态布尔hh(int[]答案){
ArrayList temp=新的ArrayList();
int n;
for(int i=0;i温度大小()){
返回false;
}
对于(int k=0;k
使用main方法中提供的数组,“hh”方法应返回true,但返回false。问题在于
集合。sort(temp)
,它按升序对输入集合排序,而您希望它按降序排序。您可以使用Collections.sort(临时、Collections.reverseOrder())
这是代码中的逻辑问题
我应该指出,有些语句在代码中是不必要的(例如Collections.sort(temp)
之后的for
循环,它什么也不做),其他语句可以增强(例如前两个for
循环,而不是复制整个数组,然后对其进行过滤,为什么不只是复制所需的元素?),您还可以通过使用while(true)
循环来避免使用递归
以下代码将帮助您解决问题:
publicstaticvoidmain(字符串[]args){
int[]答案={16,9,9,15,9,7,9,11,17,11,4,9,12,14,14,12,17,0,3,16};
系统输出打印LN(hh(答案));
}
//这是实际的Havel Hakimi算法
公共静态布尔hh(int[]答案){
while(true){
//从应答数组中筛选零
ArrayList temp=新的ArrayList(数组
//从int[]获取流
.stream(答案)
//过滤器零(返回一个IntStream)
.过滤器(a->a!=0)
//将其重新转换为流
.boxed()
//将流收集为列表
.collect(Collectors.toList());
//如果筛选后筛选数组变为空,请检查筛选后的数组
if(temp.isEmpty()){
返回true;
}
//按降序对过滤后的数组进行排序
Collections.sort(temp,Collections.reverseOrder());
//移除第一个元素(注意,Remove方法返回移除的元素)
int n=温度移除(0);
//检查第一个删除的元素是否大于数组的新大小
如果(n>温度大小()){
返回false;
}
//为下一次迭代重建输入数组
answer=IntStream.range(0,temp.size())
.map(i->i
如果您不熟悉
流
,您可以简单地将用于
循环。问题在于集合。sort(temp)
,它按升序对输入集合进行排序,而您希望它按降序排序。您可以使用Collections.sort(临时、Collections.reverseOrder())
这是代码中的逻辑问题
我应该指出,有些语句在代码中是不必要的(例如Collections.sort(temp)
之后的for
循环,它什么也不做),其他语句可以增强(例如前两个for
循环,而不是复制整个数组,然后对其进行过滤,为什么不只是复制所需的元素?),您还可以通过使用while(true)
循环来避免使用递归
以下代码将帮助您解决问题:
publicstaticvoidmain(字符串[]args){
int[]答案={16,9,9,15,9,7,9,11,17,11,4,9,12,14,14,12,17,0,3,16};
系统输出打印LN(hh(答案));
}
//这是实际的Havel Hakimi算法
公共静态布尔hh(int[]答案){
while(true){
//从应答数组中筛选零
ArrayList temp=新的ArrayList(数组
//从int[]获取流
.stream(答案)
//过滤器零(返回一个IntStream)
.过滤器(a->a!=0)
//将其重新转换为流
.boxed()
//将流收集为列表
.collect(Collectors.toList());
//如果筛选后筛选数组变为空,请检查筛选后的数组
if(temp.isEmpty()){
返回true;
}
//按降序对过滤后的数组进行排序
Collections.sort(temp,Collections.reverseOrder());
//移除第一个元素(注意,Remove方法返回移除的元素)
int n=温度移除(0);
//检查第一个删除的元素是否大于数组的新大小
如果(n>温度大小()){
返回false;
}
//为下一次迭代重建输入数组
ans