標籤:

刷題大戰 09 代碼評審報告

如大家所知,不甘寂寞的我組織了一場百人線上刷題活動。

我設計了活動宣傳圖片,創建了用於提交代碼的github倉庫,甚至還準備自掏腰包給大家發獎品。。。

好吧,實際參加活動的只有8個人,8個人,8個人。。。

之前在學習群發布這個消息的時候,那麼多人熱情高漲的喊,「算我一個」,「刷題帶我一個」,「我能參加嗎」,大哥,你們人呢?

讓我先哭一會兒。

不過,大家都喜歡喊我「小馬哥」,作為哥怎麼能氣餒呢?如果哥都氣餒了,「小弟們」還怎麼跟你混?

好啦!做事情要有始有終,雖然現在只有8個人參加,但是我相信只要咱們的活動一直組織下去,總有一天會迎來名副其實的百人刷題大作戰的。

下面是這次活動的代碼評審報告。另外新一期的刷題活動也開始了,這次的題目是第13題,歡迎來戰。

倉庫地址:githubwoniu/learnprogram

格式跟我之前做題筆記的格式一樣,只是代碼章節換成了代碼評審。

鏈接

leetcode.com/problems/p

題目

這道題目是讓我們判斷一個數是不是迴文數,但是題目本身有一個補充要求「Do this without extra space」。

釋義

後面這句話的字面意思是「不要使用額外的空間」,這就有點懵逼了。

你是不讓用其他命名空間的東西呢?還是說少用點存儲空間?

如果是說命名空間,哪些算是額外的呢?只讓用std?

如果是說存儲空間,多少算多呢?是說不讓拷貝輸入?

真是嗶了狗了,想也想不通,還是先解題吧,不管什麼狗屁空間了。。。

補充描述

為了弄明白最後那句話是啥意思,毫不猶豫的把它的補充描述打開了。

  1. 負數算是迴文數嗎?
  2. 如果你想通過把整int換成string來解這道題目,注意咱的限定「不要使用額外的空間」
  3. 你也可以嘗試反轉整數來解題,這個時候你就得考慮溢出問題了

從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

解題思路上沒什麼問題,只是從代碼上能看出來,這位同學還沒有養成好的編碼風格。比如:

  1. 盡量多的添加花括弧,即使if後面只有一句話
  2. 變數聲明和定義盡量靠近使用的地方
  3. 最後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框架的鏈接放了出來

github.com/bajdcc/CCGui

總有一天,我們去集體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來做的,這個恐怕很多人都沒有想到。

代碼有點長,放個鏈接吧

github.com/githubwoniu/

總是懷疑她的代碼好像不能pass,大家可以仔細看看

這次的評審就到這裡了,期待大家參與新的刷題活動


推薦閱讀:

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

TAG:LeetCode | C | 编程 |