您的位置:首页 > 职场人生

看大神文章小结——微软等面试 16,17

2013-05-06 11:12 246 查看
大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165

第 16 题(树):

题目(微软):

输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

例如输入

8

/ \

6 10

/ \ / \

5 7 9 11

输出 8 6 10 5 7 9 11。

这一题 读题 一下子就有了灵感。 我需要一个数组什么的 记录一下 遍历的数据。 还需要一个 index 指示遍历的位置。 首先初始化。将跟节点 放入 list 里面去。 将 index 指向 数组里面的第一个节点。 然后开始做循环。 只要 index 小于 list 的个数。 就获取index 指向的 节点。 将这个节点的 左右节点(非空) 全部放入到 list 里面去。 一直循环下去。

思想 就是 一边 遍历 一边往集合里面 加数据。这样 就会是一排一排的了。

代码如下

private void myPrintNode(Node node){
int index=0;
List<Node> nodeList=new ArrayList<Node>();
nodeList.add(node);

Node nodeC=null;
while(index<nodeList.size()){
nodeC=nodeList.get(index);
if(nodeC.getLeft()!=null){
nodeList.add(nodeC.getLeft());
}
if(nodeC.getRight()!=null){
nodeList.add(nodeC.getRight());
}
index++;
}

for(Node nodeL:nodeList){
System.out.println(nodeL.getNum());
}

}


相信这个答案 应该比较清晰明了。 去看看别人的思路。大神们说了一堆 俺不懂的名词。 看了代码 思路其实差不多。 然后说了一些东西 我有时间 去看看 地址记下 http://blog.sina.com.cn/s/blog_5e3ab00c0100lya2.html
第 17 题(字符串):

题目:在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。

分析:这道题是 2006 年 google 的一道笔试题。

光看题目 感觉 也不是很难。 不过 估计需要算法优化吧。 毕竟是google 的题目。 不过 我就先按照我的思路 做一个复杂一点的吧。我能想到的 就是通过 map 这样的东西 key 就是 各个字符。 而value 就是 出现的单词。 可能 还需要 一个队列 记录着 之前查找过的只有一个的字符串。先这样做了试试

public static void main(String[] args) {
String testStr="abaccdeff";
char[] testArr=testStr.toCharArray();

Map<Character,Integer> testMap=new HashMap<Character,Integer>();
List<Character> list=new ArrayList<Character>();

for(char c:testArr){
if(testMap.get(c)==null){
testMap.put(c, 1);
list.add(c);
}else{
testMap.put(c, 2);
}
}
for(char c:list){
if(testMap.get(c)==1){
System.out.println(c);
break;
}
}
}


这样就ok了 不过 明显 循环多。 而且 在循环里面 去取 map 可能性能 会有影响吧。 特别是第二个循环 是可以优化的。 比如 不用list来记录 用一个更好一点的 比如说数。 然后 在 第一个循环的 else里面 移除掉 发现又2个的元素。 这样 可能会好一点? 不管了 看看别人怎么写的。

看了下答案 也是这么写的 ok 完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: