一道Google2009夏季实习生招聘笔试程序设计题

前两天看到有人在发Google实习生招聘题,自己手痒也实现了一个。
    原帖地址:http://www.blogjava.net/andyelvis/archive/2009/04/14/265496.html

原题:
要求:写一个函数void count(char* input,int len),此函数的功能是计算出一个字符串中每个字符的个数,不区分大小写,输出结果时按字符在字符串中出现的先后顺序。使用程序语言不限。
例如:input="abCc*b",输出结果是a:1 b:2 c:2 *:1

  1   import   static  java.lang.System.out;
  2   import  org.junit.Test;
  3  
  4   /**
  5    * 一道Google2009夏季实习生招聘笔试程序设计题 
  6    * 要求:写一个函数void count(char* input,int len),此函数的功能是计算出一个字符串中每个字符的个数,不区分大小写,输出结果时按字符在字符串中出现的先后顺序。使用程序语言不限。
  7    * 例如:input="abCc*b",输出结果是a:1 b:2 c:2 *:1
  8    *  @author  Johny Huang
  9    * @date 2009-4-14
 10     */
 11   public   class  TestCountChar {
 12       
 13        public   static   class  BNode{
 14            private  BNode left;
 15            private  BNode right;
 16            private   int  count;
 17            private   char  character;
 18           
 19            public  BNode( char  c, int  count){
 20                this .character = c;
 21                this .count = count;
 22           }
 23            public   char  getCharacter() {
 24                return  character;
 25           }
 26            public   void  setCharacter( char  character) {
 27                this .character  =  character;
 28           }
 29            public  BNode getLeft() {
 30                return  left;
 31           }
 32            public   void  setLeft(BNode left) {
 33                this .left  =  left;
 34           }
 35            public  BNode getRight() {
 36                return  right;
 37           }
 38            public   void  setRight(BNode right) {
 39                this .right  =  right;
 40           }    
 41  
 42            public   int  getCount() {
 43                return  count;
 44           }
 45            public   void  setCount( int  count) {
 46                this .count  =  count;
 47           }
 48            public   void  addOne(){
 49                this .count ++ ;
 50           }
 51       }
 52       
 53       @Test
 54        public   void  test(){
 55            char [] input = " fbagcdagaddddgFBAGCDAGADDDDG " .toCharArray();
 56           count(input,input.length);
 57       }
 58       
 59        /**
 60        * 
 61        *  @param  input 传入的字符数组
 62        *  @param  len 需要处理的长度
 63         */
 64        public   void  count( char [] input, int  len){
 65            /*
 66            * 主要思想是用一个二叉树来存储字符,这样可以减少字符对比的次数(至少减少一半),
 67            * 另外再用一个数组(或链表)来保存字符的顺序。
 68             */
 69                   
 70            // 校验参数
 71            if (input == null ){
 72                return ;
 73           }
 74            if (len < 1 || input.length  < 1 ){
 75                return ;
 76           }
 77           
 78            int  length = len;
 79            if (len > input.length){
 80               length = input.length;
 81           }
 82            // 拷贝一个小写的字符数组
 83            char [] inputCopy = new   char [length];        
 84            for ( int  i = 0 ;i < length;i ++ ){
 85               inputCopy[i] = Character.toLowerCase(input[i]);
 86           }
 87           
 88            // 取第一个字符作为根节点
 89           BNode root = new  BNode(inputCopy[ 0 ], 1 );
 90            // 将当前节点设为根节点
 91           BNode current = root,temp;
 92           
 93            // 申请一个节点数组来保存字符顺序,当然也可以用List来保存
 94           BNode[] charSeq = new  BNode[length];
 95           charSeq[ 0 ] = root;
 96            // charSeq数组的下标(索引)
 97            int  charSeqIndex = 1 ;
 98            char  curChar;
 99           
100            // 从第二个字符开始遍历字符数组
101            for ( int  i = 1 ;i < length;i ++ ){
102               curChar = inputCopy[i];
103                while ( true ){        
104                    // 如果字符与当前节点字符相同,则累加1
105                    if (curChar == current.getCharacter()){
106                       current.addOne();
107                        break ;
108                   } else  {                
109                        if (curChar < current.getCharacter()){
110                            // 如果字符小于当前节点字符,则转向左子节点对比                            
111                            if (current.getLeft() == null ){
112                                // 左子节点为空,则加入新的节点
113                                temp = new  BNode(curChar, 1 );
114                                current.setLeft(temp);
115                                 // 将节点引用保存到数组
116                                charSeq[charSeqIndex] = temp;
117                                charSeqIndex ++ ;
118                                 break ;
119                           }
120                           current = current.getLeft();
121                       } else {
122                            // 如果字符大于当前节点字符,则转向右子节点对比
123                            if (current.getRight() == null ){
124                                temp = new  BNode(curChar, 1 );
125                                current.setRight(temp);
126                                charSeq[charSeqIndex] = temp;
127                                charSeqIndex ++ ;
128                                 break ;
129                           }
130                           current = current.getRight();
131                       }                    
132                   }                
133               }
134                // 将当前节点指向根节点
135               current = root;
136           }
137           
138            for (BNode node:charSeq){
139               out.print(node.getCharacter() + " : " + String.valueOf(node.getCount()) + "   " );
140           }
141       }
142       
143   }

   
    主要是通过二叉树来保存字符,从而减少对比的次数来达到优化。因为想到很多面试题目都不给用泛型,所以这里都用数组实现了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值