刷題大戰 09 代碼評審報告
如大家所知,不甘寂寞的我組織了一場百人線上刷題活動。
我設計了活動宣傳圖片,創建了用於提交代碼的github倉庫,甚至還準備自掏腰包給大家發獎品。。。好吧,實際參加活動的只有8個人,8個人,8個人。。。之前在學習群發布這個消息的時候,那麼多人熱情高漲的喊,「算我一個」,「刷題帶我一個」,「我能參加嗎」,大哥,你們人呢?讓我先哭一會兒。不過,大家都喜歡喊我「小馬哥」,作為哥怎麼能氣餒呢?如果哥都氣餒了,「小弟們」還怎麼跟你混?
好啦!做事情要有始有終,雖然現在只有8個人參加,但是我相信只要咱們的活動一直組織下去,總有一天會迎來名副其實的百人刷題大作戰的。
下面是這次活動的代碼評審報告。另外新一期的刷題活動也開始了,這次的題目是第13題,歡迎來戰。
倉庫地址:githubwoniu/learnprogram
格式跟我之前做題筆記的格式一樣,只是代碼章節換成了代碼評審。
鏈接
https://leetcode.com/problems/palindrome-number/
題目
這道題目是讓我們判斷一個數是不是迴文數,但是題目本身有一個補充要求「Do this without extra space」。
釋義
後面這句話的字面意思是「不要使用額外的空間」,這就有點懵逼了。
你是不讓用其他命名空間的東西呢?還是說少用點存儲空間?如果是說命名空間,哪些算是額外的呢?只讓用std?如果是說存儲空間,多少算多呢?是說不讓拷貝輸入?
真是嗶了狗了,想也想不通,還是先解題吧,不管什麼狗屁空間了。。。補充描述
為了弄明白最後那句話是啥意思,毫不猶豫的把它的補充描述打開了。
- 負數算是迴文數嗎?
- 如果你想通過把整int換成string來解這道題目,注意咱的限定「不要使用額外的空間」
- 你也可以嘗試反轉整數來解題,這個時候你就得考慮溢出問題了
從2來看題目的限定多半是不想讓我們用string來解題,所以我們直接不考慮string了。
從3來看,它在提醒我們如果反轉的話還得考慮溢出問題,這麼說的話肯定反轉也不是什麼好的解法了。所以我們考慮其他的解法。代碼
leetcode/09/leetcode_09.md
看得出來,這位同學比較用心,做題的時候還不忘幫忙宣傳我的專欄,感謝。
他這裡使用的是反轉的方法來解題,如果反轉後的數字和反轉前相等,則返回true。
下面是他的代碼
class Solution {npublic:n bool isPalindrome(int x) {n int b = 0,val = x;n if(x == 0)n return true;n if(x < 0)n return false;nn elsen {n while(val)n { n b = b*10+val%10;n val = val/10;n }n if(x == b)n return true;n elsen return false;n }n }nn};n
解題思路上沒什麼問題,只是從代碼上能看出來,這位同學還沒有養成好的編碼風格。比如:
- 盡量多的添加花括弧,即使if後面只有一句話
- 變數聲明和定義盡量靠近使用的地方
- 最後return時的if…else…是沒必要的
稍微做了一下代碼整理,如下:
class Solution {npublic:n bool isPalindrome(int x) {n if (x < 0)n {n return false;n }nn int iTemp = x, b = 0;nn while (iTemp)n {n b = b * 10 + iTemp % 10;n iTemp /= 10;n }nn return x == b;n }n};n
leetcode/09/note_acwa.md
這位同學也有代碼風格上的問題。在工作中,通常我對這類問題的要求是比較嚴格的,好的編碼風格能夠減少閱讀者的障礙,一個團隊中,你的代碼不是為自己寫的,所以我會一再強調代碼風格和變數命名。
class Solution {npublic:n int pow_ten(int x)n {n int s=1;n for(int i=1; i<=x; ++i)//使用前置遞增n s*=10;n return s;n }n bool isPalindrome(int x) {n if(x<0) return false;n int n = 1;n int xx=x;n while(xx/10!=0)n {n n++;n xx/=10;n }n if(n==1) return true;//這個判斷不需要n while(n>1)n {n int i=(x/(pow_ten(n-1)));n int j=(x%10);n if(i!=j) return false;n x/=10;n x%=(pow_ten(n-2));n n-=2;n }n return true;n }n};n
這位同學自己說這是一個笨方法,其實我最開始想到的也是這種方法,一次性拿到首和尾進行比較,這樣可以即時返回。
leetcode/09/note_bajdcc.md
這是一個老鳥,老到能用c++寫GUI的程度了,我還沒資格評審他的代碼(其實是太長太深奧了,留著慢慢深挖他),逃。。。
老鳥同志把自己fork輪子哥GUI框架的鏈接放了出來
https://github.com/bajdcc/CCGuiFoundation
總有一天,我們去集體commit他!來嗎?
leetcode/09/note_cormen.md
這位同學一看就是不按套路出牌,題目解釋、做題思路統統沒有,上來就一段代碼,留完碼就閃人。。。
喂,同學,你代碼違規了,喂。。。
class Solution {npublic:nn bool isPalindrome(int x) {n if(x < 0) return false;nn bool result = false;nn string str = to_string(x);n string str2(str);n reverse(str.begin(),str.end());nn if(str == str2) result = true;nn return result;n }n};n
leetcode/09/note_freetime.md
好吧,又來一個直接上代碼的。
bool isPalindrome(int x) {n int temp, new_num;n temp = x;n new_num = 0;n if(x < 0)n {n return 0;n }n elsen {n while(temp!=0)n {n new_num *= 10;n new_num += temp%10;n temp /= 10;n }n if(new_num == x)n {n return 1;n }n elsen {n return 0;n }n }n}n
和前面第一位同學的解題思路一樣,代碼寫的也差不多。稍微好點的地方是變數命名上還算是用心。
leetcode/09/note_ilittlesun.md
嗯,這位同學提供了兩種解題思路。
//代碼一nclass Solution {npublic:n bool isPalindrome(int x) {n if(x<0)n return false;n vector<int> v;n int num_sum = 0; //沒必要了,直接用vector的size就可以n while(x != 0){n v.push_back(x % 10);n x /= 10;n ++num_sum;n }n for(int i=0; i<(num_sum/2); ++i){n if(v[i] != v[num_sum-1-i])n return false;n }n return true;n }n};n
另外一種解法和前面的相同,就不再寫了。
leetcode/09/note_leakey.md
這位同學上來就放了一段python代碼,果然python可以一行搞定
return str(x).reverse() == str(x)n
後面短短的一段代碼竟然有兩個解法
class Solution {npublic:n bool isPalindrome(int x) {n if (x < 0)n return 0;n int sum = 0, temp = x;n while (x){n sum = sum * 10 + x % 10;n x /= 10;n }n return temp == sum;n }n bool isPalindrome1(int x) {n string s1 = to_string(x), s2 = s1;n reverse(s1.begin(), s1.end());n return s1 == s2;n }n};n
一看就是老司機,沒啥可說的。
leetcode/09/tutu09.cpp
兔兔同學是用stringstream來做的,這個恐怕很多人都沒有想到。
代碼有點長,放個鏈接吧
https://github.com/githubwoniu/learnprogram/blob/master/leetcode/09/tutu09.cpp
總是懷疑她的代碼好像不能pass,大家可以仔細看看
這次的評審就到這裡了,期待大家參與新的刷題活動

推薦閱讀:
※std::make_index_sequence的簡單實現和簡單應用
※GacUI:初步完成Workflow腳本轉C++的工作
※《C++ Primer》讀書筆記-第七章 06 類的靜態成員
※Roman To Integer
