6
回答
5个编程问题,第五题
终于搞明白,存储TCO原来是这样算的>>>   

https://www.oschina.net/news/87258/solve-five-problems-in-5minutes

技术差,练练手:new Node(100,9);

结果:

123-4-5-6-7+8-9
123+45-67+8-9
1+23-4+5+6+78-9
1+2+34-5+67-8+9
1+23-4+56+7+8+9
12+3-4+5+67+8+9
1+2+3-4+5+6+78+9
123+4-5+67-89
12+3+4+5-6-7+89
12-3-4+5-6+7+89
123-45-67+89

class Node {
    private int value1;
    private String operator;
    private int value2;
    private int factor;
    private List<Node> childNodes;
    private Node parent;
    public Node(int result,int maxFactor) {
        this(result,null,0,maxFactor,null);
    }
    private Node(int value1,String operator,int value2,int factor,Node parent) {
        if(operator==null) {
            this.value1 = value1;
            List<Node> childNodesTemp = new ArrayList<Node>();
            childNodesTemp.add(new Node(value1+factor,"-",factor,factor,null));
            childNodesTemp.add(new Node(value1-factor,"+",factor,factor,null));
            childNodesTemp.add(new Node(value1,"",factor,factor,null));
            this.childNodes = childNodesTemp;
        } else {
            this.value1 = value1;
            this.operator = operator;
            this.value2 = value2;
            this.factor = factor;
            this.parent = parent;
            if(factor>2) {
                if("".equals(operator)) {
                    List<Node> childNodesTemp = new ArrayList<Node>();
                    childNodesTemp.add(new Node(value1+((factor-1)*(int)Math.pow(10, 1+Math.floor(Math.log10(value2)))+value2),"-",(factor-1)*(int)Math.pow(10, 1+Math.floor(Math.log10(value2)))+value2,factor-1,this));
                    childNodesTemp.add(new Node(value1-((factor-1)*(int)Math.pow(10, 1+Math.floor(Math.log10(value2)))+value2),"+",(factor-1)*(int)Math.pow(10, 1+Math.floor(Math.log10(value2)))+value2,factor-1,this));
                    childNodesTemp.add(new Node(value1,"",(factor-1)*(int)Math.pow(10, 1+Math.floor(Math.log10(value2)))+value2,factor-1,this));
                    this.childNodes = childNodesTemp;
                }else {
                    List<Node> childNodesTemp = new ArrayList<Node>();
                    childNodesTemp.add(new Node(value1+factor-1,"-",factor-1,factor-1,this));
                    childNodesTemp.add(new Node(value1-factor+1,"+",factor-1,factor-1,this));
                    childNodesTemp.add(new Node(value1,"",factor-1,factor-1,this));
                    this.childNodes = childNodesTemp;
                }
            } else if(factor==2) {
                if(isRight(this)) {
                    print(this.getValue1(),this,"");
                }
            }
        }
    }
    private void print(int begin,Node node,String exp) {
        if(node!=null&&node.getOperator()!=null) {
            if(begin!=0) {
                exp += begin;
            }
            if(!"".equals(node.getOperator())) {
                exp += node.getOperator()+node.getValue2();
            }
            print(0,node.getParent(),exp);
        } else {
            System.out.println(exp);
        }
    }
    private boolean isRight(Node parent) {
        if((!"".equals(parent.getOperator())&&parent.getValue1()==1)||("".equals(parent.getOperator())&&parent.getValue1()==parent.getValue2()+(int)Math.pow(10, 1+Math.floor(Math.log10(parent.getValue2()))))) {
            return true;
        }
        return false;
    }
    public int getValue1() {
        return value1;
    }
    public void setValue1(int value1) {
        this.value1 = value1;
    }
    public String getOperator() {
        return operator;
    }
    public void setOperator(String operator) {
        this.operator = operator;
    }
    public int getValue2() {
        return value2;
    }
    public void setValue2(int value2) {
        this.value2 = value2;
    }
    public int getFactor() {
        return factor;
    }
    public void setFactor(int factor) {
        this.factor = factor;
    }
    public List<Node> getChildNodes() {
        return childNodes;
    }
    public void setChildNodes(List<Node> childNodes) {
        this.childNodes = childNodes;
    }
    public Node getParent() {
        return parent;
    }
    public void setParent(Node parent) {
        this.parent = parent;
    }
}

<无标签>
举报
士别三日
发帖于2个月前 6回/659阅
共有6个评论 最后回答: 4周前

你想表达什么意思

--- 共有 1 条评论 ---
codingcx有兴趣可以添加架构师交流圈,请加微信号 codingcx,也可以添加java技术交流QQ群号318815519,大家一起快乐交流技术,互相学习分享。 4周前 回复

看着好复杂,写了个普通版本

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		list.add(1);
		searchExprs(list, 2);
	}

	public static void searchExprs(List<Integer> list, int n) {
		int size = list.size();

		list.add(n);
		if (n < 9) {
			searchExprs(list, n + 1);
		} else if (sum(list) == 100) {
			print(list);
		}
		list.remove(size);

		list.add(-n);
		if (n < 9) {
			searchExprs(list, n + 1);
		} else if (sum(list) == 100) {
			print(list);
		}
		list.remove(size);

		int lastIndex = size - 1;
		int val = list.get(lastIndex);
		if (val > 0) {
			list.set(lastIndex, list.get(lastIndex) * 10 + n);
		} else {
			list.set(lastIndex, list.get(lastIndex) * 10 - n);
		}
		if (n < 9) {
			searchExprs(list, n + 1);
		} else if (sum(list) == 100) {
			print(list);
		}
	}

	private static int sum(List<Integer> list) {
		return list.stream().collect(Collectors.summingInt(Integer::intValue));
	}

	private static void print(List<Integer> list) {
		StringBuilder sb = new StringBuilder();
		for (Integer e : list) {
			if (sb.length() == 0) {
				sb.append(e);
			} else if (e > 0) {
				sb.append(" + ").append(e);
			} else {
				sb.append(" - ").append(-e);
			}
		}
		System.out.println(sb);
	}

 

--- 共有 1 条评论 ---
士别三日其实我们思路一样,不过你用的是正向遍历,然后筛选。我是逆向遍历,从结果倒推。 2个月前 回复

大多数时候,不是我们不努力,而是不知从何下手,我深知一份好的学习资料是多么的重要,我们通常会把大量的时间都浪费在找资源上。有时候就算有了视频资源,但是没有一个清晰的学习路线,我们依旧 会事倍功半,海量资源,不用到处找,V薪关注【八戒程序猿】就够了。系统学习编程

 

我们能做什么?

1、提供最新的视频学习资源

 

2、给初学者提供学习线路以及对应学习资源

 

3、培训机构15000元的学习课程,我们免费送你200G+视频学习资源

 

4、CSDN网络课堂2000-3000元的课程,我们就是一百度云链接。

 

 

V薪关注【八戒程序猿】就够了,并没有培训班那么贵。

有兴趣可以添加架构师交流圈,请加微信号 codingcx,也可以添加java技术交流QQ群号318815519,大家一起快乐交流技术,互相学习分享。

顶部