day 01
第一題:
題目:在字串中查詢第一次出現且只出現一次的字元。
如輸入「asdfgfdsa」,則輸出『g』。
演算法解析:
演算法1:
從頭到尾開始掃瞄這個字串。當訪問到某個字元時,一次和後面的字元比較。如果後面字元沒有與該字元相同的字元,就說明這個字元是第一次出現的字元。如果字串有n個字元,每個字元可能與後面的o(n)個字元相比較,因此這種思路時間複雜度是o(n^2)。
解法二,
既然題目與字串中字元的次數有關,我們可以來統計一下字元出現的次數。那麼怎麼統計這個次數呢
我們需要一種容器,這種容器可以存放字元出現的次數。並且次數和還存在著一種對映關係。
能夠滿足這種需求的容器就是雜湊表了。我們可以將字元的ascii碼值作為雜湊表的下標,即key值。字元出現的次數,作為雜湊表對應下標內容。即value值。
//初始化雜湊表
int i=0;
for(;i0;
}//根據字元acsii碼值
//確定雜湊表的key值和雜湊表的value值
char *hashkey=pstring;
while(*hashkey!='\0')
hashkey=pstring;
while(*hashkey!='\0')
hashkey++;
}return
'\0';
}int main()
執行結果:
expected o,actual :o
expected ,actual :
expected o,actual :o
expected ,actual :o
第2題:在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
解題思路:
解法1.以行為單位。依次遍歷陣列的每個元素,這種演算法的時間複雜度為為n^2
解法2,根據陣列的特性,從左到右,一次增大,從下到上,一次減小。可以將我們的搜尋出發點設為左下角的座標,這樣如果查詢的元素比左下角的元素大,則了列數+1,如果比左下角的元素小,就把行數-1。如果相同,則說明找到了。其他元素同理。
1.求出行數,列數
2,設定出發點為左下角的點
3.開始迴圈查詢
( 1)如果目標元素比陣列元素小,則將行數減1
( 2)如果目標元素比陣列元素大,則將列數加1
( 3)如果目標元素與陣列相等,則返回true;
class solution
else
if(target
else
}return
false;}};
第3題輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。1.定義兩個指標:快指標,
2.慢指標。讓快指標從頭指標開始遍歷先走k-1步,此時,慢指標保持不變。
3.從第k步開始,慢指標也開始從鍊錶的頭指標開始遍歷。由於連個指標距離保持在k-1步,當快指標到達鍊錶的節點時,慢指標剛好走到第k個節點
class solution
while(p2->next !=
null)
return p1;}};
求乙個字串中的最大長度的數字字串,並將該字串的長度返回解析:
要求取出最長數字字串,說明字串中可能存在多個數字字串,因此我們要設定乙個變數(tmpcount)來儲存最大字串的長度,還需要定義乙個變數來儲存臨時字串等的長度(maxcount)。並設定乙個inode記錄數字字串的位置。
當遇到數字時,tmpcount開始計數,如果此時tmpcount大於maxcount,則更新maxcount和inode.否則保持不變。
如果不是數字,tmpcount置為0即可。
遍歷完成,如果maxcount沒有更新,則直接返回空串
否則開始拷貝最大長度的數字字串。
//開始迴圈遍歷字串
int i=0;
for(i=0;iif(inputstr[i]>='0' && inputstr[i]<='9')
}else
}if(maxcount==0)
//開始拷貝目標字串
*oputstr=(char *)malloc(sizeof(char)*(maxcount+1));
strncpy(*oputstr,inputstr+tmppos-maxcount+1,maxcount);
(*oputstr)[maxcount]='\0';//此處*oputstr必須加括號,否則會產生段錯誤
return maxcount;
}int main()
執行結果:
[zyc@localhost
string]$ ./a.out
asdf123
數字字串:123
num=3
[zyc@localhost
string]$ ./a.out
a1s2d3
數字字串:3
num=1
[zyc@localhost
string]$ ./a.out
asdfg
數字字串:
num=0
[zyc@localhost
string]$ ./a.out
123456
數字字串:123456
num=6
程式設計練習 字串相關
1.題目 設計函式 void insert char s,char t,int pos 在串s的位置pos 1和pos之間插入串t。假設分配給串s的空間足以插入串t。要求不使用任何字串庫函式。include using namespace std void insert char s,char t,...
牛客網習題練習 倒置字串
題目表述 將一句話的單詞倒置,標點不倒置,例如 輸入 i like beijing.輸出 beijing.like i 實現思路 設定兩個棧,先將字串逐個壓入第乙個棧,如果遇到空格的話就說明乙個單詞結束,將第乙個棧的所有元素包括空格壓入第二個棧,迴圈執行,直到字串全部入棧。最後,依次pop第二個棧,...
程式設計練習 字串系列
1 空格替換 請編寫乙個方法,將字串中的空格全部替換為 20 假定該字串有足夠的空間存放新增的字元,並且知道字串的真實長度 小於等於1000 同時保證字串由大小寫的英文本母組成。給定乙個string inistring 為原始的串,以及串的長度 int len,返回替換後的string 測試樣例 m...