看大神文章小结——微软等面试 16,17
2013-05-06 11:12
295 查看
大神 地址 :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 里面去。 一直循环下去。
思想 就是 一边 遍历 一边往集合里面 加数据。这样 就会是一排一排的了。
代码如下
相信这个答案 应该比较清晰明了。 去看看别人的思路。大神们说了一堆 俺不懂的名词。 看了代码 思路其实差不多。 然后说了一些东西 我有时间 去看看 地址记下 http://blog.sina.com.cn/s/blog_5e3ab00c0100lya2.html
第 17 题(字符串):
题目:在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
分析:这道题是 2006 年 google 的一道笔试题。
光看题目 感觉 也不是很难。 不过 估计需要算法优化吧。 毕竟是google 的题目。 不过 我就先按照我的思路 做一个复杂一点的吧。我能想到的 就是通过 map 这样的东西 key 就是 各个字符。 而value 就是 出现的单词。 可能 还需要 一个队列 记录着 之前查找过的只有一个的字符串。先这样做了试试
这样就ok了 不过 明显 循环多。 而且 在循环里面 去取 map 可能性能 会有影响吧。 特别是第二个循环 是可以优化的。 比如 不用list来记录 用一个更好一点的 比如说数。 然后 在 第一个循环的 else里面 移除掉 发现又2个的元素。 这样 可能会好一点? 不管了 看看别人怎么写的。
看了下答案 也是这么写的 ok 完成
第 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 完成
相关文章推荐
- 看大神文章小结——微软面试4
- 看大神文章小结——微软等面试12,13,14
- 看大神文章小结——微软等面试 41-45
- 看大神文章小结——微软等面试 39,40
- 看大神文章小结——微软等面试 23,24,25,26
- 看大神文章小结——微软等面试 31,32,33,34
- 看大神文章小结——微软等面试 35,36,37,38
- 看大神文章小结——微软等面试10,11
- 看大神文章小结——微软等面试 20,21
- 看大神文章小结——微软面试3
- 看大神文章小结——微软面试2
- 看大神文章小结——微软面试1
- 看大神文章小结——微软面试5,6
- 看大神文章小结——微软等面试7,8
- 看大神文章小结——微软等面试 18,19
- 看大神文章小结——微软等面试 27,28,29,30
- 微软等数据结构+算法面试100题(16)--查找子串
- 微软面试100题目之17 :在一个字符串中找到第一个只出现一次的字符。
- 微软面试100题之17题:在一个字符串中找到第一个只出现一次的字符
- 微软等数据结构+算法面试100题(17)--复制两个字符串A 和B