一看到題目, 直覺就是用 stack 去實作
class Solution {
public:
/*
* @param s: A string
* @return: A string
*/
string reverseWords(string &s) {
// write your code here
stack<string> strStack;
string word;
string::iterator iter;
for (iter = s.begin(); iter != s.end(); iter++) {
if (' ' == *iter) {
if (0 != word.length()) {
strStack.push(word);
word.erase();
}
}
else {
word.push_back(*iter);
}
}
if (0 != word.length()) {
strStack.push(word);
}
string result;
while(! strStack.empty()) {
if (0 != result.length()) {
result.push_back(' ');
}
result.append(strStack.top());
strStack.pop();
}
return result;
}
};
越級打怪的工程師
2017年11月8日 星期三
[Lintcode] 13. strStr
只想到用暴力解, 兩個迴圈去掃描字串
public:
/*
* @param source: source string to be scanned.
* @param target: target string containing the sequence of characters to match
* @return: a index to the first occurrence of target in source, or -1 if target is not part of source.
*/
int strStr(const char *source, const char *target) {
// write your code here
if (NULL == source || NULL == target) {
return -1;
}
if ('\0' == *source && '\0' == *target) {
return 0;
}
int srcIdx = 0;
while ('\0' != source[srcIdx]) {
bool isMatch = true;
int srcTestIdx = srcIdx, tgtIdx = 0;
while ('\0' != target[tgtIdx]) {
if (target[tgtIdx] != source[srcTestIdx]) {
isMatch = false;
break;
}
srcTestIdx++;
tgtIdx++;
}
if (isMatch) {
return srcIdx;
}
srcIdx++;
}
return -1;
}
};
2017年11月4日 星期六
[Leetcode] 65. Valid Number
解法本身不難, 但是要想清楚數字的規則
{空格}{+/-}{整數或浮點數}{e}{+/-}{整數}{空格}
public:
enum State {
PRE_SPACE,
SIGN,
BEFORE_PT_NUM,
POINT,
AFTER_PT_NUM,
EXP,
AFTER_EXP_SIGN,
AFTER_EXP_NUM,
POST_SPACE
};
bool isNumber(string s) {
bool flag[9] = {false};
State state = PRE_SPACE;
for (std::string::iterator iter = s.begin() ; iter != s.end() ; iter ++) {
switch (state) {
case PRE_SPACE:
if (' ' == *iter) {
state = PRE_SPACE;
}
else if ('+' == *iter || '-' == *iter) {
state = SIGN;
if (flag[state]) {
return false;
}
}
else if ('0' <= *iter && '9' >= *iter) {
state = BEFORE_PT_NUM;
}
else if ('.' == *iter) {
state = POINT;
if (flag[state]) {
return false;
}
}
else {
return false;
}
flag[state] = true;
break;
case SIGN:
if ('0' <= *iter && '9' >= *iter) {
state = BEFORE_PT_NUM;
}
else if ('.' == *iter) {
state = POINT;
if (flag[state]) {
return false;
}
}
else {
return false;
}
flag[state] = true;
break;
case BEFORE_PT_NUM:
if ('0' <= *iter && '9' >= *iter) {
state = BEFORE_PT_NUM;
}
else if ('.' == *iter) {
state = POINT;
if (flag[state]) {
return false;
}
}
else if ('e' == *iter) {
state = EXP;
if (flag[state]) {
return false;
}
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case POINT:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_PT_NUM;
}
else if ('e' == *iter) {
state = EXP;
if (flag[state]) {
return false;
}
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case AFTER_PT_NUM:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_PT_NUM;
}
else if ('e' == *iter) {
state = EXP;
if (flag[state]) {
return false;
}
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case EXP:
if ('+' == *iter || '-' == *iter) {
state = AFTER_EXP_SIGN;
if (flag[state]) {
return false;
}
}
else if ('0' <= *iter && '9' >= *iter) {
state = AFTER_EXP_NUM;
}
else {
return false;
}
break;
case AFTER_EXP_SIGN:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_EXP_NUM;
}
else {
return false;
}
break;
case AFTER_EXP_NUM:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_EXP_NUM;
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case POST_SPACE:
if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
default:
return false;
}
flag[state] = true;
}
if ((BEFORE_PT_NUM == state || POINT == state || AFTER_PT_NUM == state || AFTER_EXP_NUM == state || POST_SPACE == state) &&
(flag[BEFORE_PT_NUM] || flag[AFTER_PT_NUM])) {
return true;
}
return false;
}
};
{空格}{+/-}{整數或浮點數}{e}{+/-}{整數}{空格}
class Solution {
public:
enum State {
PRE_SPACE,
SIGN,
BEFORE_PT_NUM,
POINT,
AFTER_PT_NUM,
EXP,
AFTER_EXP_SIGN,
AFTER_EXP_NUM,
POST_SPACE
};
bool isNumber(string s) {
bool flag[9] = {false};
State state = PRE_SPACE;
for (std::string::iterator iter = s.begin() ; iter != s.end() ; iter ++) {
switch (state) {
case PRE_SPACE:
if (' ' == *iter) {
state = PRE_SPACE;
}
else if ('+' == *iter || '-' == *iter) {
state = SIGN;
if (flag[state]) {
return false;
}
}
else if ('0' <= *iter && '9' >= *iter) {
state = BEFORE_PT_NUM;
}
else if ('.' == *iter) {
state = POINT;
if (flag[state]) {
return false;
}
}
else {
return false;
}
flag[state] = true;
break;
case SIGN:
if ('0' <= *iter && '9' >= *iter) {
state = BEFORE_PT_NUM;
}
else if ('.' == *iter) {
state = POINT;
if (flag[state]) {
return false;
}
}
else {
return false;
}
flag[state] = true;
break;
case BEFORE_PT_NUM:
if ('0' <= *iter && '9' >= *iter) {
state = BEFORE_PT_NUM;
}
else if ('.' == *iter) {
state = POINT;
if (flag[state]) {
return false;
}
}
else if ('e' == *iter) {
state = EXP;
if (flag[state]) {
return false;
}
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case POINT:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_PT_NUM;
}
else if ('e' == *iter) {
state = EXP;
if (flag[state]) {
return false;
}
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case AFTER_PT_NUM:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_PT_NUM;
}
else if ('e' == *iter) {
state = EXP;
if (flag[state]) {
return false;
}
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case EXP:
if ('+' == *iter || '-' == *iter) {
state = AFTER_EXP_SIGN;
if (flag[state]) {
return false;
}
}
else if ('0' <= *iter && '9' >= *iter) {
state = AFTER_EXP_NUM;
}
else {
return false;
}
break;
case AFTER_EXP_SIGN:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_EXP_NUM;
}
else {
return false;
}
break;
case AFTER_EXP_NUM:
if ('0' <= *iter && '9' >= *iter) {
state = AFTER_EXP_NUM;
}
else if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
case POST_SPACE:
if (' ' == *iter) {
state = POST_SPACE;
}
else {
return false;
}
break;
default:
return false;
}
flag[state] = true;
}
if ((BEFORE_PT_NUM == state || POINT == state || AFTER_PT_NUM == state || AFTER_EXP_NUM == state || POST_SPACE == state) &&
(flag[BEFORE_PT_NUM] || flag[AFTER_PT_NUM])) {
return true;
}
return false;
}
};
2014年5月27日 星期二
SSN 申請社會安全碼
2014年5月14日 星期三
加州駕照 - 路考篇
路考只接受預約考試, 不能當天進 DMV 排隊, 所以要記得先去預約路考時間。
路考當天, 首先要先到櫃台報到, 接著會拿到一張評分單, 然後就是開著車前往路考區排隊, 等待路考官來考試。在排隊等待考試的時候, 建議可以看一下前面的考生是怎麼考試的, 順便放鬆心情。
輪到之後, 考官會先考手勢以及車輛的操作, 這部分網路上都可以找到相關的資訊, 也可以在等待的時候, 觀察前面的考生, 基本上不太會有問題。
接著就是路考, 每個 DMV 都有不只一條路考的路線, 可以事先上網搜尋一下, 然後考試前去DMV附近繞一繞, 熟悉附近的路況。
個人覺得在選擇路考的地點時, DMV 附近路況越單純的越好, 然後考試時間盡量避開上下學或是上下班的時間, 這樣可以減少在路上遇到特殊狀況的機會, San Jose 周邊的話, 強力推薦 Los Gatos, 附近路況單純, 速限不高, 慢慢開就好。
路考結束之後, 考官會講評你的開車行為, 當場就會知道考試結果。如果通過了, 就可以去櫃台拿臨時駕照, 並且確認駕照的郵寄地址。如果不幸失敗了, 也不要灰心, 再去預約一次路考就是了。
路考當天, 首先要先到櫃台報到, 接著會拿到一張評分單, 然後就是開著車前往路考區排隊, 等待路考官來考試。在排隊等待考試的時候, 建議可以看一下前面的考生是怎麼考試的, 順便放鬆心情。
輪到之後, 考官會先考手勢以及車輛的操作, 這部分網路上都可以找到相關的資訊, 也可以在等待的時候, 觀察前面的考生, 基本上不太會有問題。
接著就是路考, 每個 DMV 都有不只一條路考的路線, 可以事先上網搜尋一下, 然後考試前去DMV附近繞一繞, 熟悉附近的路況。
個人覺得在選擇路考的地點時, DMV 附近路況越單純的越好, 然後考試時間盡量避開上下學或是上下班的時間, 這樣可以減少在路上遇到特殊狀況的機會, San Jose 周邊的話, 強力推薦 Los Gatos, 附近路況單純, 速限不高, 慢慢開就好。
路考結束之後, 考官會講評你的開車行為, 當場就會知道考試結果。如果通過了, 就可以去櫃台拿臨時駕照, 並且確認駕照的郵寄地址。如果不幸失敗了, 也不要灰心, 再去預約一次路考就是了。
訂閱:
文章 (Atom)