我要編程

    華爲編程比賽,我順利落榜,經過短暫的失落感之後,我很快又回來coding世界了!請收了我吧,請允許我一步一步走下去,請理解我初期的蝸牛似的行進腳步,我會創造越來越靠譜的正值加速度的。
    河畔水人很多,牛人也不少,但這不是我泡湯的理由,主要還是自己真心太水了。3個題擺在我面前,不要說兩個鐘頭coding三個,就是隻把第二個拿來我c,兩個鐘頭也未必能辦妥,所以。。。哈哈,華爲GG,這一次你刷掉我,是對的,但我決定:努力不給你第二次刷我的機會,喲。

    剛剛不是說到第二題嘛,雖然說出來有點更加襯托我的暴弱,但我還是說吧,立刻開始。


    1.  [自動完成]輸入字符串,然後在單詞本中查找有木有與輸入字符串匹配的單詞,若有,則輸出匹配的單詞到輸出數組;單詞本中的單詞以空格相隔。
    例如:單詞本中的單詞集爲"chengdu chongqing huanghe changjiang",我輸入"ch",則應輸出"chengdu chongqing changjiang"......
    函數原型:
void auto_complete(char *dict,char *input,char output[])
    函數定義:
/************************************************************
*  Name: auto_complete
*  Copyright: @ee
*  Author: 辰採星 
*  Date: 2012-04-25
*  Description: 爲了賣關子,就不了,並且cut掉註釋哦

*************************************************************/

void auto_complete(char *dict,char *input,char output[])
 {
      if(NULL == dict || NULL == input || NULL == output)
      {
           printf("Invalid arguments!\n");
           getchar();
           exit(1);
      }
      char *p = output;
      int k = 0;
      int j = 0;
      int i = 0;
      while(*(dict + i) != '\0')
      {
           while(' ' == *(dict + i))
           ++i;
           while(*(input + j) != '\0' && *(dict + i) != '\0')
           {
               if(*(dict + i) == *(input + j))
               {
                   ++i;
                   ++j;
               }
               else
                   break;
      }
 
      if('\0' == *(input + j) && (0 == (i - j) || ' ' == *(dict + i - j - 1)))
      {
           for(k = i - j;*(dict + k) != ' ';++p,++k)
               *p = *(dict + k);
           *(p++) = ' ';
            j = 0;
      }
      else
      {
           j = 0;
      }
      ++i;
      }
      *p = '\0';
 }


    coding & testing後感:
    修正思路的錯誤就花了哥哥幾百滴汗水啊!然後仍然百調不得其解,今天走在去食堂的途中,纔有一道靈光打在我的腦袋上,媽呀,是不是。。。?回宿舍一改。。。最後知道真相的我眼淚掉下來。。。尼瑪,果然是你啊——'\0',冷落了你這麼久,太對不住了,請原諒我吧,看在我也受了時間之罰的情分上。
    當然,這個函數依賴於C風格的字符串,這是不妥之一。應該還有之二、之三。。。等等吧,等我線下尋找。

    2.  《編程之美》上有這麼一道小題,給定一個主串s1,拿一個模式串s2來,看s2能否在s1中通過循環移位來找到匹配的字串,能則返回true,否則返回false。

    例如:s1 = "AABECD",s2 = "CDAA",應該返回true;而如果s2 = "BED",則要返回false了。
    函數原型:
_Bool rot_match(char *dict,char *input)
    函數定義:
/*******************************************************************
*  Name: RotateMatch
*  Copyright: @ee
*  Author: 辰採星 
*  Date: 2012-04-23
*  Description: 也cut掉註釋哦,我再想想我的邏輯對了沒有呢 
********************************************************************/

_Bool rot_match(char *dict,char *input)
 {
     int len_in = strlen(input);
     int len_dict = strlen(dict);
     int len_tmp = 2 * len_dict;
     int i = 0;
     int j = 0;
     while(i < len_tmp)
     {
         if(*(dict + i % len_dict) == *(input + j))
         {
             ++i;
             ++j;
         }
         else
             ++i;
     }
     if(len_in == j)
         return true;
     else
         return false;
 }

    字符串真是不容易操控啊!
******************************************************************************************************
Review @ 2012-04-27 :
    auto_complete()函數作了多餘的比較,因爲是單詞左端匹配查詢得嘛,比如,一旦首字母失配,就應該直接比較下一個單詞,而不是上述代碼裏所做的:繼續比較,之後再來判斷有木有失配。當然,我覺得這個字典結構本身不完美,要是組織成指針數組,就漂亮點了。

Review @ 2012-04-30 :
    C99之前的C標準沒有布爾類型。
******************************************************************************************************

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章