攜程筆試中的一道程式設計題
阿新 • • 發佈:2019-02-04
題目:字串去符號。
將輸入的一串字串中的標點符號都刪掉。
輸入樣例:
String:a1,b2.c3-d4!
輸出樣例:
Stringa1b2c3d4
最一開始想到的就是劍指offer中的{面試題4:替換空格}
時間也很緊就大概想了想沒有怎麼認真考慮。
結果出現覆蓋現象。
然後我就換成了兩個陣列一個遍歷一個賦值。
程式碼如下:
#include <iostream> #include <vector> #include <numeric> #include <limits> #include<string> using namespace std; #define N 100 char* change(char putin[],int n) { if(putin == NULL) return NULL; int strcount = 0; for(int i = 0;i<n;++i) { if((putin[i]>='a'&&putin[i]<='z')||(putin[i]>='A' && putin[i]<='Z')||(putin[i]>='0'&&putin[i]<='9')) ++strcount; } int p1 = n-1; int p2 = strcount-1; char *putout = new char[strcount]; putout[strcount] = '\0'; while( p2>=0) { if((putin[p1]>='a'&&putin[p1]<='z')||(putin[p1]>='A' && putin[p1]<='Z')||(putin[p1]>='0'&&putin[p1]<='9')) { putout[p2--] = putin[p1--]; } else { --p1; } } return putout; } int main() { char putin[N]; char *putout; gets(putin); int n = strlen(putin); putout = change(putin,n); puts(putout); }
回顧劍指offer中的替換空格:
題目:
請實現一個函式,把字串中的每個空格替換成“%20”。
輸入樣例:
we are happy.
輸出樣例:
we%20are%20happy.
考慮到如果從前往後換的話,每遇到一個空格後面那一大堆就要移動,這樣時間複雜度就有點大了。
從後開始移動就好多了,因為新的字串一定比舊的長或相等,只要不是短就不會出現覆蓋的現象。
具體的實現過程如下:
程式碼:
舉一反三題:#include<iostream> using namespace std; void ReplaceBlank(char string[],int length) { if(string == NULL||length <= 0) //注意考慮這些邊邊角角的問題 return; int originalLength = 0; int numOfBlank = 0; int i=0; while(string[i] != '\0') //統計string字串的真是長度和空格長度 { ++originalLength; if(string[i] == ' ') ++numOfBlank; ++i; } int newLength = originalLength + numOfBlank*2; if(newLength > length) return; int p1 = originalLength; int p2 = newLength; while(p1 >= 0 && p2 > p1) //這個限制條件很重要!!! { if(string[p1] == ' ') { string[p2--] = '0'; string[p2--] = '2'; string[p2--] = '%'; } else { string[p2--] = string[p1]; } --p1; } } int main() { char string[50]; gets(string); ReplaceBlank(string,50); puts(string); }
有兩個排序的陣列A1和A2,記憶體在A1末尾有足夠多的空餘空間容納A2。請實現一個函式,把A2中的所有數字插入到A1中並且所有數字都是排序的。
#include<iostream> using namespace std; #define N 5 void merge_num(int numA1[],int numA2[],int n1,int n2) { int p1 = n1-1; int p2 = n2-1; int p3 = n1+n2-1; while(p1>=0 && p2>=0) { if(numA1[p1] >= numA2[p2]) numA1[p3--] = numA1[p1--]; else if(numA1[p1] < numA2[p2]) numA1[p3--] = numA2[p2--]; } if(p2 == 0) { numA1[p3] = numA2[p2]; } } int main() { int numA1[2*N] = {2,4,9,11,15,16,20}; int numA2[N] = {3,9,14}; merge_num(numA1,numA2,7,3); for(int i=0;i<2*N;++i) { cout<<numA1[i]<<"-->"; } cout<<endl; }