像站長這種小孬孬,還是決定先用 Regular Expression 試水溫。
不過就算是用 Regular Expression,還是費了好一番功夫。直到從 Regular Expression Cookbook 抄了一堆範例才成功,下方為 JavaScript 版源碼:
/** * @param {string} s * @return {boolean} */ var isNumber = function(s) { return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][-+]?[0-9]+)?\s*$/.test(s); };直接把上方的 JavaScript 翻譯成 C 語言效果如何?
#define IS_SIGN(ch) (ch == '+' || ch == '-') #define IS_EXP(ch) (tolower(ch) == 'e') bool isNumber(char* s) { int len; char *begin, *end; if(s == 0 || (len = strlen(s)) == 0) return false; begin = s; end = s + len - 1; while(isspace(*begin)) ++begin; while(isspace(*end) && end > begin) --end; if(begin > end) return false; ++end; if(IS_SIGN(*begin)) ++begin; if(isdigit(*begin)){ ++begin; while(isdigit(*begin)) ++begin; if(*begin == '.'){ ++begin; while(isdigit(*begin)) ++begin; } if(begin >= end){ return true; }else if(IS_EXP(*begin)){ ++begin; }else{ return false; } if(begin >= end) return false; if(IS_SIGN(*begin)) ++begin; if(isdigit(*begin)) ++begin; else return false; while(isdigit(*begin)) ++begin; if(begin >= end) return true; else return false; }else if(*begin == '.'){ ++begin; if(isdigit(*begin)) ++begin; else return false; while(isdigit(*begin)) ++begin; if(begin >= end) return true; else if(IS_EXP(*begin)) ++begin; else return false; if(IS_SIGN(*begin)) ++begin; if(isdigit(*begin)) ++begin; else return false; while(isdigit(*begin)) ++begin; if(begin >= end) return true; else return false; }else{ return false; } }這樣也只有第三名,第一名究竟用了什麼妖術?
由這份題解可以發現,http://weibo.com/luangong 用了有限狀態機,所以只需要走訪一次字串即可。還有人用 strtod,那就比 Regular Expression 更像作弊了wwww
沒有留言:
張貼留言