簡單題
1.移動0
283. 移動零 - 力扣(LeetCode)
剛開始沒看到非零子串的順序不變:
// if(nums.size() == 1){// return;// }// //所有 0 移動到數組的末尾//同時保持非零元素的相對順序。// int n = nums.size();// int notZero = n-1;//// int zero = 0;// while(zero<notZero){// while(notZero==0){// notZero--;// }// while(zero!=0){// zero++;// }// swap(nums[zero],nums[notZero]);// zero++;// notZero--;// }
之后還是【1,0】測試用例沒過?
void moveZeroes(vector<int>& nums) {int i = 0;int j =0;while(i<=j){while(i<nums.size() && nums[i]!=0){i++;}while(j<nums.size() && nums[j]==0){j++;}if(i<nums.size() && j<nums.size()){cout<<i<<j<<endl;swap(nums[i],nums[j]);}else{break;}i++;j++;}}
開始覺得雙指針的思路確實不應該這樣
首先是一個for一直遍歷,然后另一個偶爾改變
我希望維護一個第一個0的位置,一個第一個非0 的位置【必須在0位置之后】
【這一點建議在舉例子的時候考慮到,比如2,3,0,9】?
我決定遍歷第一個0的位置
第一個非0 的位置取max(i+1,j)
class Solution {
public:void moveZeroes(vector<int>& nums) {int nz = 0;for (int z = 0; z < nums.size(); z++) {if(nums[z]!=0){//continue;}// cout<<z<<endl;nz = max(nz,z+1);while(nz<nums.size() && nums[nz]==0){nz++;}if(nz<nums.size()){swap(nums[nz],nums[z]);}}
}
};
2.相交鏈表
while(pa &&pb)//原來想簡單了,覺得pa和pb應該同時到終點,畢竟挪動了abs(asize-bsize)
咦,那為什么會出現這種情況呢
3.回文鏈表
1.經典while中p沒寫p = p->next;
2.鏈表一般的邊界是考慮head==nullptr和head->next? ==nullptr;
3.
翻轉鏈表中,最后的頭是pre,以及pre=cur要放在前面,防止cur = nex覆蓋了pre
4.合并兩個有序鏈表
卡住了
本來想l2插入到l1,不斷比較l1中cur,next和cur2大小關系
還不如類似新建一個鏈表,不是新建嗷
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode dummy(-1000);ListNode* tail = &dummy;while (list1 && list2) {if (list1->val < list2->val) {tail->next = list1;list1 = list1->next;} else {tail->next = list2;list2 = list2->next;}tail = tail->next;}// 連接剩余鏈表tail->next = list1 ? list1 : list2;return dummy.next;}
};