思路:分析到此題並不是簡單的把乙個結點劃分為左右子樹就可以的,因而使用遞迴時必定需要重新定義乙個函式,函式的引數即為需要比較的兩個樹,該樹的特徵即a的左子樹與b的右子樹相同,同理a的右子樹與b的左子樹相同,此時即為true。
需要注意的一點是,分析好邏輯關係,如下:
if(lf==null&&rt==null)
return true;
if((lf==null&&rt!=null)||(rt==null&&lf!=null))
return false;
if(lf->val!=rt->val)
return false;
邏輯不能錯誤,即三個if語句的順序不能顛倒。
該題較為簡單,問題在於怎麼簡化。
常規方法兩層迴圈的情況下,就算剪枝了也達不到很好的效果,因此我們使用一層迴圈來做。
一層迴圈思路如下:
遍歷陣列,記錄min,並定義max=price[i]-min
,此時max即為最大差值。
該題最直觀也是最高效的方法即為把收益圖畫出來,可以證明第i個點到第j個點的直接漲幅一定小於等於i到j的斷續漲幅之和,故我們只要每次累積求和兩連續點之間的增幅即可,o(n)複雜度。
思路:
乙個最容易想到的方法就是對字串一次變數,篩選出不是alphanumeric characters的字元並刪去,另外對於大寫字元我們轉換成小寫字元,最後對處理後的字串我們反轉它並與原來的字串去做比較即可。
知識點:
isalpha(s[i])、isdigit(s[i])、isupper(s[i])
分別判斷該字元是否為字母、數字、大寫字母;
tolower()
將字元轉化成小寫字母
string類中的刪除方法:s.erase(pos,n)
,即從pos處刪除字元s中長為n的子串,並返回修改後的string物件引用。注意,刪除時s.size()的大小也發生變化,需要對下標進行處理才能正常使用。
可以使用異或的解法,關於異或操作有以下性質:
因而我們只需要一次遍歷,設初值為0,累積求異或即可。
此題為單鏈表插入排序的模擬,我們新建乙個單鏈表,為了規範,依舊使用帶頭結點的單鏈表。注意,結點的使用需要重新定義,不能定義臨時結點為外部變數,應設定為區域性變數,當不用時下一次重新初始化(簡單的更新會錯誤覆蓋,即指標位址被錯誤更改)。
/**
* definition for singly-linked list.
* struct listnode
* }listnode;
*/class solution
else
// 插在t之後
listnode* cur=new listnode
(p->val)
; cur->next=t->next;
t->next=cur;
// temp->val=p->val; //該種寫法不對,會被錯誤覆蓋
注意一些細節的處理,以及運算元的前後順序。
class solution
for(
int j=
0;j.size()
;j++
) temp=temp*flag;if(
isdigit
(tokens[i][0
]))// 運算元則壓入棧中
stack1.
push
(temp)
;// 操作符則取棧頂的兩個元素
else
stack1.
push
(ans);}
}return stack1.
top();}};
LeetCode 劍指offer刷題10 1
leetcode 劍指offer刷題 劍指 offer 10 i.斐波那契數列 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是...
LeetCode刷題總結
123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...
LeetCode刷題總結
123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...