设为首页 收藏本站
查看: 810|回复: 0

[经验分享] VMware coding Challenge

[复制链接]

尚未签到

发表于 2015-4-7 14:05:08 | 显示全部楼层 |阅读模式
DSC0000.jpg
DSC0001.jpg
  
  思路:这道题要观察,举个例子,1 2 * * 3 * 4  5 * * 6 7 * 8 * *, 用Stack,先序遍历,遇到数字就入栈,如果遇到 * *,说明栈顶节点是叶子节点,一条根到叶子的路径这时候就存在于栈之中,只要计算栈的size(),就知道当前这条路径的深度,树的height就是这些深度的最大值。
  空格的引入增添了不少判断上的麻烦, 比如: ab * *, 这棵树的height是1 而不是2. 在遍历节点的时候需要注意取空格之前的所有元素一起看
  第三遍办法:倒序读数组,用stack存。遇到“*”存入0,遇到数字,pop两次,取最大值+1,再push入栈



1 public class Solution5 {
2     public int treeHeight(String preorder) {
3         if (preorder==null || preorder.length()==0) return -1;
4         preorder.trim();
5         if (preorder.length() == 0) return -1;
6         String[] strs = preorder.split(" ");
7         int len = strs.length;
8         Stack st = new Stack();
9         for (int i=len-1; i>=0; i--) {
10             if (strs.length() == 0) return -1; // cases that input has two spaces, wrong input
11             if (strs.equals("*")) {
12                 st.push(0);
13             }
14             else {
15                 if (st.size() == 0) return -1;
16                 int num1 = st.pop();
17                 if (st.size() == 0) return -1;
18                 int num2 = st.pop();
19                 st.push(Math.max(num1, num2) + 1);
20             }
21         }
22         if (st.size() != 1) return -1;
23         return st.peek();
24     }
25
26     public static void main (String[] args) {
27         Solution5 a = new Solution5();
28         int ret = a.treeHeight("a b * * *");
29         System.out.println(ret);
30     }
31 }
  
  第二遍做法:仿效preorder traversal的iterative做法,用Stack, 因为有空格,先split(" "), 这样把它转化为array,且解决了上面ab * *的问题,
  但是做OA的时候,大部分case过了,还是有小case过不了



1 public class Solution {
2    public int treeHeight(String preorder) {
3        if (preorder==null || preorder.length()==0) return -1;
4        preorder.trim();
5        if (preorder.length() == 0) return -1;
6        String[] ar = preorder.split(" ");
7        Stack st = new Stack();
8        int maxHeight = 0;
9        int curHeight = 0;
10        String root = ar[0];
11        int i = 0;
12        while (!root.equals("*") || !st.isEmpty()) {
13            if (!root.equals("*")) { // not null
14                st.push(root);
15                curHeight++;      // this node's height
16                maxHeight = Math.max(maxHeight, curHeight); //all time heighest
17                root = ar[++i];   // next node in preorder tranversal
18            }
19            else {
20                st.pop();
21                if (ar[i-1].equals("*")) curHeight = st.size() + 1; //only a=="*" && a[i-1]=="*", curheight will change
22                root = ar[++i];
23            }
24        }
25        if (i != ar.length) return -1; // if not reaching the end of the preorder array, then the tree is not valid
26        return maxHeight;
27    }
28 }
  第21行比较tricky, 解释如下,如果遇到两个星的情况如**,表示遇到叶子节点了,pop操作之后,下一个节点(假设叫x)一定是某个节点(假设叫y)的第一个右节点,而且节点y已经不在stack里了,刚被pop掉,所以当前curHeight更新为 stack.size()+1, 这个1就是加上节点y的一层

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-54621-1-1.html 上篇帖子: VMware 下安装Linux 操作系统的全过程 下篇帖子: 安装virtualbox后 vmware桥接模式的虚拟机无法上网
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表