程式設計題 關於字串

2021-09-10 18:25:47 字數 3400 閱讀 8520

目錄

把字串轉換成整數(劍指歐肥兒)

第乙個只出現一次的字元(劍指歐肥兒)

左旋轉字串(劍指歐肥兒)

字元流中第乙個不重複的字元(劍指歐肥兒)

題目描述:將乙個字串轉換成乙個整數(實現integer.valueof(string)的功能,但是string不符合數字要求時返回0),要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是乙個合法的數值則返回0。

輸入描述:輸入乙個字串,包括數字字母符號,可以為空

輸出描述:如果是合法的數值表達則返回該數字,否則返回0

示例一:

輸入:

+2147483647

1a33

輸出:

2147483647

0

解題**一:

class solution 

//確定正負號

if(str[i] == '+')else if(str[i] == '-')

//開始生成數字,檢查不是數字的字元

while(str[i] != '\0')else

}return num;}};

解題思路:排除字串最前面的空字元' '

確定正負號

將字串生成數字,如果含有非數字的字元,則直接返回0,方法用的是 num = num * 10 + x * (str[i] - '0')

這個**,其實還是有漏洞,如果測試用例裡含有溢位的數字則會報錯。

解題**二:

class solution 

//確定正負號

if(str[i] == '+')else if(str[i] == '-')

//開始生成數字,檢查不是數字的字元

while(str[i] != '\0')else

}return num * x;}};

解題思路:這個**和**一的**唯一的不同是,num = (num << 1) + (num << 3) + (str[i] & 0xf);這段**的含義和 num = num * 10 +  (str[i] - '0');的含義一模一樣,但是沒有符號,所以最後return的時候是 乘上了符號的num。

位運算的好處是比乘法運算效率高了那麼一點點點點。

(num << 1) + (num << 3)就是 num*10,字元'0'到'9'的ascii值的低4個二進位制位剛好就是0到9所以str[i]&0xf等於str[i]-'0',如下圖所示。

題目描述:在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫).

解題**:

class solution 

for(int i = 0; i < size; i++)

}return -1;}};

解題思路:判斷英文本元出現次數這種題,第乙個反應就是要麼用陣列,要麼用雜湊表。所以,對於這道題,我們用更方便和容易理解的雜湊表。

又因為,要判斷第乙個唯一字元出現的位置,那麼我們首先肯定要遍歷完整個字串才可以得到,哪些字母是唯一出現的,然後再遍歷一遍整個字串,看哪個字串在雜湊表裡是1,只要遇到是1的字元,立刻返回得到的值。如果,遍歷完整個字串也沒有遇到雜湊表鍵對應的值為1的字元,那麼最後只能返回-1,這個-1還包括字串長度為0的情況。

題目描述:組合語言中有一種移位指令叫做迴圈左移(rol),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s=」abcxyzdef」,要求輸出迴圈左移3位後的結果,即「xyzdefabc」。是不是很簡單?ok,搞定它!

解題**:

class solution 

for(int i = n; i < str.length(); i++)

aft = aft + pre;

return aft;}};

解題思路:這道題太簡單了,只要明白操作字串的幾個函式就可以,不過這裡並不需要用操作字串的函式。

兩個for迴圈把前n個字元往後顛倒放置。

題目描述:請實現乙個函式用來找出字元流中第乙個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第乙個只出現一次的字元是"g"。當從該字元流中讀出前六個字元「google"時,第乙個只出現一次的字元是"l"。

輸出描述:如果當前字元流沒有存在出現一次的字元,返回#字元。

解題**一:

class solution

else

}for(int i = 0; i < s.size(); i++)

}return '#';

}private:

vectors;

};

解題思路:這道題的解題思路和「程式設計題——真題訓練三(aqy)」裡的「刪除重複字元」這一道題很像。

這裡迷惑人的地方就是,把輸入字串拆成了乙個函式。實際上就是乙個輸入函式(功能是:乙個乙個輸入字元)。

解題**二:

class solution

}return n;

}private:

string s;

int hash[256] = ;

};

解題思路:這個**和上個**的解題思路也是一模一樣的。

但是在這裡提出來說,是因為hash[256]這個int型變數,它的作用和上乙個**的map的作用是一樣的,但是為什麼是hash[256]呢?因為,ascii碼一共就有255個

關於字串旋轉技巧程式設計題

1.輸入乙個英語句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串 i am a student。則輸出 student.a am i 演算法思想 先翻轉整個句子,然後,依次翻轉每個單詞。並依據空格來判斷單詞起始和終止的位置。可執行 public...

程式設計題 攀爬字串

給定乙個字串s1,將其遞迴地分割成兩個非空子字串,從而將其表示為二叉樹。下面是s1 great 的乙個可能表達 great gr eat g r e at a t在攀爬字串的過程中,我們可以選擇其中任意乙個非葉節點,然後交換該節點的兩個兒子。例如,我們選擇了 gr 節點,並將該節點的兩個兒子進行交換...

程式設計題 醜陋的字串

輸入描述 輸入包括乙個字串s,字串長度length 1 length 50 字串只包含 a b 三種字元。輸出描述 輸出乙個整數,表示最小的醜陋值 輸入例子1 a?a 輸出例子1 0 include include using namespace std int main int count 0 i...