<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Heis的Blog

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

    一道Google2009夏季實習生招聘筆試程序設計題

        前兩天看到有人在發Google實習生招聘題,自己手癢也實現了一個。
        原帖地址:http://www.tkk7.com/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 }
       
        主要是通過二叉樹來保存字符,從而減少對比的次數來達到優化。因為想到很多面試題目都不給用泛型,所以這里都用數組實現了。





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

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

    評論

    # re: 一道Google2009夏季實習生招聘筆試程序設計題  回復  更多評論   

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

    # re: 一道Google2009夏季實習生招聘筆試程序設計題  回復  更多評論   

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

    # re: 一道Google2009夏季實習生招聘筆試程序設計題  回復  更多評論   

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

    # re: 一道Google2009夏季實習生招聘筆試程序設計題  回復  更多評論   

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

    # re: 一道Google2009夏季實習生招聘筆試程序設計題  回復  更多評論   

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

    # re: 一道Google2009夏季實習生招聘筆試程序設計題  回復  更多評論   

    由關聯數組想到了hashmap,應該可以吧
    2009-08-16 18:16 | xxyqiufeng

    # re: 一道Google2009夏季實習生招聘筆試程序設計題[未登錄]  回復  更多評論   

    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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲成a人片在线网站| 亚洲精品在线视频| 成人男女网18免费视频| 很黄很色很刺激的视频免费| 亚洲国产精品免费在线观看| 16女性下面无遮挡免费| 久久久久久免费视频| 成人奭片免费观看| 国产美女精品视频免费观看 | 人妻免费久久久久久久了| 一级一片免费视频播放| 国产精品午夜免费观看网站| 韩国免费a级作爱片无码| 国产猛男猛女超爽免费视频| 蜜桃视频在线观看免费视频网站WWW| 99在线热视频只有精品免费| 麻豆国产精品免费视频| 污污视频网站免费观看| 亚洲中文无韩国r级电影 | 亚洲中文字幕成人在线| 亚洲国产精品成人久久蜜臀| 精品亚洲一区二区三区在线观看| 久久久精品国产亚洲成人满18免费网站| 不卡精品国产_亚洲人成在线| 亚洲AV无码专区国产乱码电影| 久久久国产精品亚洲一区| 亚洲人成小说网站色| 狠狠入ady亚洲精品| 国产一级a毛一级a看免费视频| 亚洲电影免费在线观看| 一二三四影视在线看片免费| 四虎影永久在线高清免费| 337p日本欧洲亚洲大胆裸体艺术| 亚洲一区二区三区四区在线观看| 国产 亚洲 中文在线 字幕| 青青草国产免费国产是公开| 日本在线看片免费人成视频1000| 青青久在线视频免费观看| 免费又黄又爽又猛的毛片| 亚洲成人精品久久| 亚洲人成电影网站色|