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();
}
};