Number of Segments in a String

簡單的題目反而適合深入,因為概念不難,反而容易看到其變化無窮。

程式碼

第一版(最陽春版)

/*
Concept: go through each char of the string
         if s[index] is not space and index==0, then count++
         if s[index] is not space and s[index-1] is a space, then count++ 
         return count
*/

class Solution {
public:
    int countSegments(string s) {
        int numOfSeg = 0;

        for(int i=0; i<s.size(); i++)
        {
            if(s.at(i) != ' ' && i==0)
            {
                numOfSeg++;
                continue;
            }

            if(s.at(i) != ' ' && s.at(i-1)==' ')
                numOfSeg++;
        }

        return numOfSeg;
    }
};

第二版(稍加優化版)

class Solution {
public:
    int countSegments(string s) {
        int numOfSeg = 0;

        for(int i=0; i<s.size(); i++)
        {
            if(s.at(i) != ' ')
            {
                if(i==0) { numOfSeg++; continue;}
                if(s.at(i-1)==' ') numOfSeg++;
            }
        }

        return numOfSeg;
    }
};

第二.五版(程式碼優化版)

多虧看到第四版的程式碼,讓我把第二版再度優化,實在太酷了!

class Solution {
public:
    int countSegments(string s) {
        int numOfSeg = 0;

        for (int i = 0; i < s.size(); i++)
            numOfSeg += s[i] != ' ' && ( i==0 || s[i-1] == ' ');

        return numOfSeg;
    }
};

第三版(更加優化版)

第二版一直還有一個地方讓我覺得不怎麼舒服,就是第一個segment因為之前沒有空白,所以會需要多一個if條件,如果我塞一個空白,程式碼會變得更加簡潔。

class Solution {
public:
    int countSegments(string s) {
        int numOfSeg = 0;
        s.insert(s.begin(), ' ');

        for(int i=0; i<s.size(); i++) 
            if(s.at(i) != ' ' && s.at(i-1)==' ') numOfSeg++;

        return numOfSeg;
    }
};

第四版

前面的版本都是利用 segment 前面會有空白來計算,這個作法利用 segment 後面會有空白來計算,碰到最後一個再判斷 i+1 == s.size() 即可。

class Solution {
public:
    int countSegments(string s) {
        int numOfSeg = 0;

        for (int i = 0; i < s.size(); i++)
            numOfSeg += s[i] != ' ' && ( i+1==s.size() || s[i+1] == ' ');

        return numOfSeg;
    }
};

第五版(極致優化版)(我現在還看不懂regular expression,先記下來)

class Solution {
public:
    int countSegments(string s) {
       return regex_replace(regex_replace(s, regex("\\S+"), "x"), regex(" "), "").size();
    }
};

results matching ""

    No results matching ""