程序員編程藝術4:現場編寫類似strstr/strcpy/strpbrk的函數

第一節、字符串查找
1.1題目描述:
給定一個字符串A,要求在A中查找一個子串B。

如A="ABCDF",要你在A中查找子串B=“CD”。

思路:

(1)循環A字符串,時間複雜度(n×m)

(2)KMP匹配算法,時間複雜度(n+m)

1.2、題目描述

在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b。 

思路:hasnTable,字符作爲key,次數爲值,最後按字符順序循環hashtable,輸出次數爲1的。也可以用數字代替hashTable。

第二節、字符串拷貝
題目描述:
要求實現庫函數strcpy,
原型聲明:extern char *strcpy(char *dest,char *src); 
功能:把src所指由NULL結束的字符串複製到dest所指的數組中。  
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。  
返回指向dest的指針。

思路:

//得2分       
void strcpy( char *strDest, char *strSrc )       
{       
    while( (*strDest++ = * strSrc++) != '\0' );       
}        
  
//得4分       
void strcpy( char *strDest, const char *strSrc )        
{       
    //將源字符串加const,表明其爲輸入參數,加2分       
    while( (*strDest++ = * strSrc++) != '\0' );       
}        
  
//得7分       
void strcpy(char *strDest, const char *strSrc)        
{       
    //對源地址和目的地址加非0斷言,加3分       
    assert( (strDest != NULL) && (strSrc != NULL) );       
    while( (*strDest++ = * strSrc++) != '\0' );       
}        
  
//得9分       
//爲了實現鏈式操作,將目的地址返回,加2分!       
char * strcpy( char *strDest, const char *strSrc )        
{       
    assert( (strDest != NULL) && (strSrc != NULL) );       
    char *address = strDest;        
    while( (*strDest++ = * strSrc++) != '\0' );        
    return address;       
}      
  
//得10分,基本上所有的情況,都考慮到了    
//如果有考慮到源目所指區域有重疊的情況,加1分!       
char * strcpy( char *strDest, const char *strSrc )        
{       
    if(strDest == strSrc) { return strDest; }    
    assert( (strDest != NULL) && (strSrc != NULL) );       
    char *address = strDest;        
    while( (*strDest++ = * strSrc++) != '\0' );        
    return address;       
}  



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