練習題--字符串

這個寒假時間有點長,每天找一道面試題做做,做完再做個總結。

給定兩個字符串,請編寫程序,確定其中一個字符串的字符重新排列后,是否能變成另一個字符串。要求:時間復雜度為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;
        }
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在挖掘分析的過程當中對字符串的處理是極為重要的,且出現(xiàn)也較為頻繁,R語言作為當前最為流行的開源數(shù)據分析和可視化平臺...
    果果哥哥BBQ閱讀 5,944評論 0 8
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,270評論 0 4
  • 這學期剛開學的時候,才發(fā)覺自己大學這幾年什么都沒學到,還抑郁了,一轉眼就已經大四,于是感慨——以前和身邊的同學一樣...
    17Q_Q閱讀 233評論 8 4
  • 一葉子是世界上最天然最營養(yǎng)的化妝品,它與大自然息息相關,一花一葉都是一葉子的本質靈動無比。 隨著歲月的流逝,皮膚總...
    繁華PP閱讀 542評論 0 0
  • 上帝真的很奇怪,貓想吃魚,卻不能下水,魚喜歡吃蚯蚓,卻不能上岸 在我大概初中的時候,算是少不更事的豆蔻年華吧,那個...
    蹲在墻角等月亮閱讀 311評論 0 0