Heis的Blog

          保持簡單,保持愚蠢
          隨筆 - 29, 文章 - 1, 評論 - 122, 引用 - 0
          數(shù)據(jù)加載中……

          一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題

              前兩天看到有人在發(fā)Google實習(xí)生招聘題,自己手癢也實現(xiàn)了一個。
              原帖地址:http://www.aygfsteel.com/andyelvis/archive/2009/04/14/265496.html

          原題:
          要求:寫一個函數(shù)void count(char* input,int len),此函數(shù)的功能是計算出一個字符串中每個字符的個數(shù),不區(qū)分大小寫,輸出結(jié)果時按字符在字符串中出現(xiàn)的先后順序。使用程序語言不限。
          例如:input="abCc*b",輸出結(jié)果是a:1 b:2 c:2 *:1

            1 import static java.lang.System.out;
            2 import org.junit.Test;
            3 
            4 /**
            5  * 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題 
            6  * 要求:寫一個函數(shù)void count(char* input,int len),此函數(shù)的功能是計算出一個字符串中每個字符的個數(shù),不區(qū)分大小寫,輸出結(jié)果時按字符在字符串中出現(xiàn)的先后順序。使用程序語言不限。
            7  * 例如:input="abCc*b",輸出結(jié)果是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 傳入的字符數(shù)組
           62      * @param len 需要處理的長度
           63      */
           64     public void count(char[] input,int len){
           65         /*
           66          * 主要思想是用一個二叉樹來存儲字符,這樣可以減少字符對比的次數(shù)(至少減少一半),
           67          * 另外再用一個數(shù)組(或鏈表)來保存字符的順序。
           68          */
           69                 
           70         //校驗參數(shù)
           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         //拷貝一個小寫的字符數(shù)組
           83         char[] inputCopy=new char[length];        
           84         for(int i=0;i<length;i++){
           85             inputCopy[i]=Character.toLowerCase(input[i]);
           86         }
           87         
           88         //取第一個字符作為根節(jié)點
           89         BNode root=new BNode(inputCopy[0],1);
           90         //將當(dāng)前節(jié)點設(shè)為根節(jié)點
           91         BNode current=root,temp;
           92         
           93         //申請一個節(jié)點數(shù)組來保存字符順序,當(dāng)然也可以用List來保存
           94         BNode[] charSeq=new BNode[length];
           95         charSeq[0]=root;
           96         //charSeq數(shù)組的下標(biāo)(索引)
           97         int charSeqIndex=1;
           98         char curChar;
           99         
          100         //從第二個字符開始遍歷字符數(shù)組
          101         for(int i=1;i<length;i++){
          102             curChar=inputCopy[i];
          103             while(true){        
          104                 //如果字符與當(dāng)前節(jié)點字符相同,則累加1
          105                 if(curChar==current.getCharacter()){
          106                     current.addOne();
          107                     break;
          108                 }else {                
          109                     if(curChar<current.getCharacter()){
          110                         //如果字符小于當(dāng)前節(jié)點字符,則轉(zhuǎn)向左子節(jié)點對比                            
          111                         if(current.getLeft()==null){
          112                             //左子節(jié)點為空,則加入新的節(jié)點
          113                              temp=new BNode(curChar,1);
          114                              current.setLeft(temp);
          115                              //將節(jié)點引用保存到數(shù)組
          116                              charSeq[charSeqIndex]=temp;
          117                              charSeqIndex++;
          118                              break;
          119                         }
          120                         current=current.getLeft();
          121                     }else{
          122                         //如果字符大于當(dāng)前節(jié)點字符,則轉(zhuǎn)向右子節(jié)點對比
          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             //將當(dāng)前節(jié)點指向根節(jié)點
          135             current=root;
          136         }
          137         
          138         for(BNode node:charSeq){
          139             out.print(node.getCharacter()+":"+String.valueOf(node.getCount())+" ");
          140         }
          141     }
          142     
          143 }
             
              主要是通過二叉樹來保存字符,從而減少對比的次數(shù)來達(dá)到優(yōu)化。因為想到很多面試題目都不給用泛型,所以這里都用數(shù)組實現(xiàn)了。





          程序員的一生其實可短暫了,這電腦一開一關(guān),一天過去了,嚎;電腦一開不關(guān),那就成服務(wù)器了,嚎……

          posted on 2009-04-15 22:14 Heis 閱讀(2250) 評論(7)  編輯  收藏 所屬分類: 算法題

          評論

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題  回復(fù)  更多評論   

          可以使用一個長度為256的數(shù)組來保存字符的出現(xiàn)次數(shù),索引就是字符的ASCII,再用一個數(shù)組或鏈表保存字符出現(xiàn)的順序(保存了字符的ASCII,也就是前面數(shù)組的索引)
          2009-04-16 08:41 | 銀河使者

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題  回復(fù)  更多評論   

          @銀河使者
          1.這道題目沒有說字符就一定是ASCII字符;
          2.用256的數(shù)組來保存次數(shù)難免會造成空間的浪費。
          2009-04-16 08:57 | Heis

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題  回復(fù)  更多評論   

          不錯,學(xué)習(xí)一下!與原題其它方法相當(dāng),程序適用性和健壯性都加強了```我也寫了一個簡單的```實在不如,呵呵!
          2009-04-16 10:15 | 重慶理工小子

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題  回復(fù)  更多評論   

          平均時間復(fù)雜度O(NlgN),最壞時間復(fù)雜度O(N^2).
          2009-04-16 10:45 | DoubleH

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題  回復(fù)  更多評論   

          太好了
          2009-04-28 13:47 | 棲西

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題  回復(fù)  更多評論   

          由關(guān)聯(lián)數(shù)組想到了hashmap,應(yīng)該可以吧
          2009-08-16 18:16 | xxyqiufeng

          # re: 一道Google2009夏季實習(xí)生招聘筆試程序設(shè)計題[未登錄]  回復(fù)  更多評論   

          public static void count(char[] src) {

          LinkedHashMap<Character, Integer> data = new LinkedHashMap<Character, Integer>();

          for (Character c : src) {
          Integer count = data.get(c);
          if (count == null) {
          data.put(c, 1);
          } else {
          data.put(c, ++count);
          }
          }

          for (Character c : data.keySet()) {
          Integer count = data.get(c);
          System.out.println("Character '" + c + "' occurred " + data.get(c) + " time" + (count > 1 ? "s" : "") + ".");
          }
          }
          2009-09-09 11:24 | Derek

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武汉市| 洛南县| 洪泽县| 泾阳县| 宜春市| 安塞县| 锦屏县| 潞西市| 改则县| 佛冈县| 民县| 鄂伦春自治旗| 黔西| 武冈市| 和林格尔县| 株洲县| 泰顺县| 娱乐| 怀集县| 靖安县| 特克斯县| 公安县| 区。| 浮山县| 潮州市| 龙里县| 龙胜| 五峰| 锦州市| 伊通| 车险| 伽师县| 香格里拉县| 牟定县| 普兰县| 安福县| 泽州县| 岑溪市| 永新县| 伊宁市| 仪陇县|