這個寒假時間有點長,每天找一道面試題做做,做完再做個總結。
給定兩個字符串,請編寫程序,確定其中一個字符串的字符重新排列后,是否能變成另一個字符串。要求:時間復雜度為O(n)。
思路:將兩個字符串中的字符出現(xiàn)次數(shù)分別統(tǒng)計出來,再將26個字母出現(xiàn)的次數(shù)進行比較(這里為了簡便,只考慮26個小寫字母)。如果次數(shù)完全相同,則能轉換;否則不能。
還有一種思路是先將兩個字符串按ASCII碼大小進行排序,將排序的結果進行比較即可,但由于使用了排序算法,時間復雜度至少為O(nlogn)。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
bool isAnagram(string first, string second) {
int* freqFirst = new int[26];
// memset(freqFirst, 0, 26 * sizeof(int));
for (int i = 0; i < 26; ++i) {
freqFirst[i] = 0;
}
int* freqSecond = new int[26];
memset(freqSecond, 0, 26 * sizeof(int));
for (int i = 0; i < first.size(); ++i) {
freqFirst[first[i] - 'a']++;
}
for (int i = 0; i < second.size(); ++i) {
freqSecond[second[i] - 'a']++;
}
for (int i = 0; i < 26; ++i) {
if (freqFirst[i] != freqSecond[i]) {
return false;
}
}
return true;
}
int main() {
string first, second;
cin >> first >> second;
if (isAnagram(first, second)) {
cout << "The letters of them is the same!" << endl;
} else {
cout << "They don't have the same letters!" << endl;
}
return 0;
}
實現(xiàn)一個算法,確定一個字符串的所有字符是否全都不同。要求:時間復雜度為O(n)。
思路:首先我們假設這個字符串中全都是ASCII字符(如果不是需要另外討論了),而ASCII字符集中總共有256個字符,所以如果長度大于256,則直接返回false。定義一個bool型大小為256的數(shù)組array,初始值均為false。遍歷字符串中的字符,如果這個字符是第一次出現(xiàn),那么令array[indexOfChar]等于true,如果這個字符出現(xiàn)過了,就返回false。當字符串遍歷結束后,如果沒有返回false,說明字符串中沒有重復的字符,則返回true。
#include <iostream>
#include<string>
using namespace std;
bool isDiff(string str) {
if (str.length() > 256) {
return false;
}
bool array[256];
for (int i = 0; i < 256; ++i) {
array[i] = false;
}
for (int i = 0; i < str.length(); i++) {
int indexOfChar = str[i];
if (array[indexOfChar]) {
return false;
}
array[indexOfChar] = true;
}
return true;
}
int main() {
string s;
getline(cin, s);
cout << isDiff(s) << endl;
return 0;
}
反轉一個字符串。要求:不允許使用庫函數(shù)
思路:將第一個字符與最后一個字符交換,將第二個字符與倒數(shù)第二個字符交換,...,到len / 2時結束。
#include <iostream>
#include <string>
using namespace std;
void swap(char& c1, char& c2) {
char t = c1;
c1 = c2;
c2 = t;
}
string reverseStr(string s) {
unsigned long len = s.length();
for (int i = 0; i < len / 2; ++i) {
swap(s[i], s[len - 1 - i]);
}
return s;
}
int main() {
string s;
getline(cin, s);
cout << reverseStr(s) << endl;
return 0;
}
給出一個長度不超過1000的字符串,判斷它是不是回文(順讀,逆讀均相同)的。
思路:判斷第n個與倒數(shù)第n個字符是否相同,這里使用了一個tip,即不相同時直接返回false,循環(huán)結束時沒有返回,說明是回文,則返回true。
(如果循環(huán)里面的判斷語句是判斷是否相同,則需要一個變量存儲狀態(tài)的改變,相對麻煩)
#include <iostream>
using namespace std;
bool isPalindrome(string s) {
unsigned long len = s.length();
for (int i = 0; i < len / 2; i++) {
if (s[i] != s[len - 1 - i]) {
return false;
}
}
return true;
}
int main() {
string s;
while (cin >> s) {
if (isPalindrome(s)) {
cout << "Yes!" << endl;
} else {
cout << "No!" << endl;
}
}
return 0;
}
請實現(xiàn)一個函數(shù),將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
思路:
class Solution {
public:
void replaceSpace(char *str, int length) {
if (str == NULL || length < 0) return;
int count = 0;
for (int i = 0; i < length; ++i) {
if (*(str + i) == ' ') {
++count;
}
}
char *p1 = str + length - 1;
char *p2 = str + length + 2 * count - 1;
while (p1 != p2) {
if (*p1 == ' ') {
*p2-- = '0';
*p2-- = '2';
*p2-- = '%';
} else {
*p2-- = *p1;
}
--p1;
}
}
};