大家可以试试看这个面试题,当时给的时间是1小时,当时做完这题就可以进入phone interview

题目如下:
你有足够数量的天秤和砝码。每个天秤有10磅。天秤的左右两边可以放砝码,也可以放天秤。
题目要求是,在给定的初始组合情况下,如何添加砝码,让整体保证平衡。

输入是一串数字,第一行是一个整数,代表当前初始状态一共有多少个天秤,每个天秤都有一个序号
接下来往下,每两行分别代表一个天秤左右两边所包含的天秤序号和包含的砝码重量
每一组的格式如下:
左半的砝码重量 <天秤i,天秤j,...>
右半的砝码重量 <天秤k,天秤m,...>
其中,<>表示数组
输入样例如下:
//4个天秤
0 1 //0号天秤左边放置着1号天秤
0 2 //0号天秤右边放置着2号天秤
0  //1号天秤左边啥都没有
0 3 //1号天秤右边放置着3号天秤
3  //2号天秤左边有三磅重的砝码
0  //2号天秤右边啥都没有
0  //3号天秤左边啥都没有
0  //3号天秤右边啥都没有

输出,输出N行。第i行代表第i个天秤的左右两边需要添加多少重量的砝码
输出样例如下:
0: 0 14
1: 10 0
2: 0 3
3: 0 0

大家可以试试看。当时给我的时间是1小时,当时做完这题就可以进入phone interview,可惜挂在了phone interview那- -。

四季花海
浏览 204回答 2
2回答

BIG阳

下面来简单的说一下思想:针对input来看,其实就是有一棵或多棵现成的树,目的就是把每个节点的左右两个分支配平。由于子节点的配平会影响到父节点的配平,所以很自然的就想到了用递归的方法来解这个问题。整个递归过程就是一个树的后序遍历过程。调整了代码缩进,加入必要注释package&nbsp;PhoneInterview;import&nbsp;java.io.BufferedReader;import&nbsp;java.io.File;import&nbsp;java.io.FileNotFoundException;import&nbsp;java.io.FileReader;import&nbsp;java.io.IOException;public&nbsp;class&nbsp;Balance&nbsp;{ //&nbsp;每个天秤的属性 public&nbsp;boolean&nbsp;balanced&nbsp;=&nbsp;false;//&nbsp;判断是否已经配平 public&nbsp;int&nbsp;nodeID;//&nbsp;天秤id public&nbsp;Balance[]&nbsp;leftChild&nbsp;=&nbsp;null;//&nbsp;左子树的天秤数组 public&nbsp;Balance[]&nbsp;rightChild&nbsp;=&nbsp;null;//&nbsp;右子树的天秤数组 public&nbsp;int&nbsp;balanceWeight&nbsp;=&nbsp;10;//&nbsp;自身重量 public&nbsp;int&nbsp;leftWeight&nbsp;=&nbsp;0;//&nbsp;左子树总重量 public&nbsp;int&nbsp;rightWeight&nbsp;=&nbsp;0;//&nbsp;右子树总重量 public&nbsp;int&nbsp;adding&nbsp;=&nbsp;0;//&nbsp;为了配平,还需添加多少重量的砝码 //&nbsp;递归函数 public&nbsp;static&nbsp;int&nbsp;balancing(Balance&nbsp;node)&nbsp;{ //&nbsp;判断天秤左边是否有子天秤 if&nbsp;(node.leftChild&nbsp;!=&nbsp;null)&nbsp;{ for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;node.leftChild.length;&nbsp;i++) node.leftWeight&nbsp;+=&nbsp;balancing(node.leftChild[i]); } //&nbsp;判断天秤右边是否有紫天秤 if&nbsp;(node.rightChild&nbsp;!=&nbsp;null)&nbsp;{ for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;node.rightChild.length;&nbsp;i++)&nbsp;{ node.rightWeight&nbsp;+=&nbsp;balancing(node.rightChild[i]); } } //&nbsp;天秤左右子树都计算完毕,来计算当前天秤左右重量差 node.adding&nbsp;=&nbsp;Math.abs(node.leftWeight&nbsp;-&nbsp;node.rightWeight); //&nbsp;标记该天秤已经配平 node.balanced&nbsp;=&nbsp;true; return&nbsp;node.balanceWeight&nbsp;+&nbsp;node.leftWeight&nbsp;+&nbsp;node.rightWeight +&nbsp;node.adding; } //&nbsp;主函数 public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ int&nbsp;N&nbsp;=&nbsp;0; Balance[]&nbsp;Balances; BufferedReader&nbsp;br; try&nbsp;{ //&nbsp;载入数据,初始化过程,无视这个file&nbsp;name吧 br&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;FileReader("input00.txt")); //&nbsp;load第一行,得到天秤总数 String&nbsp;string&nbsp;=&nbsp;br.readLine(); N&nbsp;=&nbsp;Integer.parseInt(string); //&nbsp;初始化Balances数组 Balances&nbsp;=&nbsp;new&nbsp;Balance[N]; int&nbsp;i&nbsp;=&nbsp;0; for&nbsp;(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;<&nbsp;N;&nbsp;k++)&nbsp;{ Balances[k]&nbsp;=&nbsp;new&nbsp;Balance(); Balances[k].nodeID&nbsp;=&nbsp;k; } /* &nbsp;*&nbsp;开始一行一行的读入数据,每两行一个循环 &nbsp;*/ while&nbsp;((string&nbsp;=&nbsp;br.readLine())&nbsp;!=&nbsp;null)&nbsp;{ //&nbsp;天秤左半部分初始化 String[]&nbsp;strs&nbsp;=&nbsp;string.split("&nbsp;"); Balances[i].leftWeight&nbsp;=&nbsp;Integer.parseInt(strs[0]); /* &nbsp;*&nbsp;这里是根据数据格式来的&nbsp;如果length超过1,那就代表除了自重的值以外&nbsp;还有放置的子天秤 &nbsp;*&nbsp;遂初始化子树上的数组,添加对子天平的引用,方便日后调用 &nbsp;*/ if&nbsp;(strs.length&nbsp;!=&nbsp;1) Balances[i].leftChild&nbsp;=&nbsp;new&nbsp;Balance[strs.length&nbsp;-&nbsp;1]; for&nbsp;(int&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;<&nbsp;strs.length;&nbsp;j++)&nbsp;{ Balances[i].leftChild[j&nbsp;-&nbsp;1]&nbsp;=&nbsp;Balances[Integer .parseInt(strs[j])]; } //&nbsp;天秤右半部分初始化 string&nbsp;=&nbsp;br.readLine(); String[]&nbsp;strs1&nbsp;=&nbsp;string.split("&nbsp;"); Balances[i].rightWeight&nbsp;=&nbsp;Integer.parseInt(strs1[0]); //&nbsp;同理左半部分的操作 if&nbsp;(strs1.length&nbsp;!=&nbsp;1) Balances[i].rightChild&nbsp;=&nbsp;new&nbsp;Balance[strs1.length&nbsp;-&nbsp;1]; for&nbsp;(int&nbsp;j&nbsp;=&nbsp;1;&nbsp;j&nbsp;<&nbsp;strs1.length;&nbsp;j++)&nbsp;{ Balances[i].rightChild[j&nbsp;-&nbsp;1]&nbsp;=&nbsp;Balances[Integer .parseInt(strs1[j])]; } i++; } //&nbsp;初始化完毕,开始配平 for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;Balances.length;&nbsp;i++)&nbsp;{ if&nbsp;(!Balances[i].balanced) Balance.balancing(Balances[i]); } //&nbsp;输出结果 for&nbsp;(int&nbsp;m&nbsp;=&nbsp;0;&nbsp;m&nbsp;<&nbsp;Balances.length;&nbsp;m++)&nbsp;{ if&nbsp;(Balances[m].leftWeight&nbsp;<&nbsp;Balances[m].rightWeight) System.out.println(m&nbsp;+&nbsp;":&nbsp;"&nbsp;+&nbsp;Balances[m].adding&nbsp;+&nbsp;"&nbsp;0"); else&nbsp;if&nbsp;(Balances[m].leftWeight&nbsp;>=&nbsp;Balances[m].rightWeight) System.out.println(m&nbsp;+&nbsp;":&nbsp;0&nbsp;"&nbsp;+&nbsp;Balances[m].adding); } }&nbsp;catch&nbsp;(FileNotFoundException&nbsp;e)&nbsp;{ //&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block e.printStackTrace(); }&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{ //&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block e.printStackTrace(); } } }

倚天杖

个人解法如下:假设天平之间没有嵌套关系(即不会出现1在2左边,2在1左边这种情况)为了使一个天平平衡,首先得把放在其左边或右边的天平配平假设力矩为0,天平左右两边重量不等时在少的一边用砝码补上重量如果符合以上,题目综合性不错,涉及了简单树的遍历以及贪心算法下面是代码(脑袋不好使状态,不知道弄对了没——反正代码风格成渣渣了)import&nbsp;sys def&nbsp;set_balance(id): &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;balanced[id]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;lcld[id]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lw[id]&nbsp;+=&nbsp;set_balance(i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;i&nbsp;in&nbsp;rcld[id]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rw[id]&nbsp;+=&nbsp;set_balance(i) &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lw[id]&nbsp;<&nbsp;rw[id]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ladd[id]&nbsp;=&nbsp;rw[id]&nbsp;-&nbsp;lw[id] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lw[id]&nbsp;+=&nbsp;ladd[id] &nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;lw[id]&nbsp;>&nbsp;rw[id]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;radd[id]&nbsp;=&nbsp;lw[id]&nbsp;-&nbsp;rw[id] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rw[id]&nbsp;+=&nbsp;radd[id] &nbsp;&nbsp;&nbsp;&nbsp;balanced[id]&nbsp;=&nbsp;True &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lw[id]&nbsp;+&nbsp;rw[id]n&nbsp;=&nbsp;int(sys.stdin.readline()) lw&nbsp;=&nbsp;[5&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]rw&nbsp;=&nbsp;[5&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]lcld&nbsp;=&nbsp;[[]&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]rcld&nbsp;=&nbsp;[[]&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]for&nbsp;i&nbsp;in&nbsp;range(n): &nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;=&nbsp;[int(v)&nbsp;for&nbsp;v&nbsp;in&nbsp;sys.stdin.readline().split()] &nbsp;&nbsp;&nbsp;&nbsp;lw[i]&nbsp;+=&nbsp;row[0] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;v&nbsp;in&nbsp;row[1:]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcld[i].append(v) &nbsp;&nbsp;&nbsp;&nbsp;row&nbsp;=&nbsp;[int(v)&nbsp;for&nbsp;v&nbsp;in&nbsp;sys.stdin.readline().split()] &nbsp;&nbsp;&nbsp;&nbsp;rw[i]&nbsp;+=&nbsp;row[0] &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;v&nbsp;in&nbsp;row[1:]: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcld[i].append(v) balanced&nbsp;=&nbsp;[False&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]ladd&nbsp;=&nbsp;[0&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]radd&nbsp;=&nbsp;[0&nbsp;for&nbsp;i&nbsp;in&nbsp;range(n)]for&nbsp;i&nbsp;in&nbsp;range(n): &nbsp;&nbsp;&nbsp;&nbsp;get_balance(i) &nbsp;&nbsp;&nbsp;&nbsp; for&nbsp;i&nbsp;in&nbsp;xrange(n): &nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;"%d:%d&nbsp;%d"&nbsp;%&nbsp;(i,&nbsp;ladd[i],&nbsp;radd[i])
打开App,查看更多内容
随时随地看视频慕课网APP