每日一演算法

2021-10-04 07:07:02 字數 1988 閱讀 8765

答主大二,這學期剛開了資料結構與演算法的課程,但課堂上只提及基礎的增刪改查,遠遠不能滿足對資料結構相對熟悉的需求,因而答主便有了『每日演算法』專題練習的想法,有需要的可以共同練習,與君共勉

適用人群:資料結構與演算法初學者

題型大多來自leetcode

請判斷乙個鍊錶是否為回文鍊錶。

示例 1: 輸入: 1->2 輸出: false

示例 2: 輸入: 1->2->2->1 輸出: true

回文鍊錶即將鍊錶的後半部分反轉後和前半部分資料一致

鍊錶無法從後邊開始遍歷,因此可以考慮使用陣列,將鍊錶元素依次賦給陣列,

遍歷陣列,比較對應位置的元素

/**

* definition for singly-linked list.

* struct listnode ;

*/bool ispalindrome

(struct listnode* head)

for(

int y=

1;y<=i/

2;y++)}

return true;

}

因為我們是使用乙個有限長的陣列儲存,所以時間複雜度為o(1),但這並不代表實現細節就很簡單哦;

使用陣列可以方便地訪問任一下標的元素,所以在這個題中可以很好地處理首尾比較的問題,下面我們來看一下如何去用鍊錶解決——

bool ispalindrome

(struct listnode* head)

//一般情況,先根據快慢節點找到中間節點,如果是奇數的話,返回中間節點的第乙個節點

struct listnode* slow_p=head;

struct listnode* p=head;

while

(p->next!=

null

&&p->next->next!=

null

)//翻轉右半部分,使用頭插法

struct listnode* head_=slow_p->next;

slow_p->next=

null

;//建立指標始終指向要反轉的節點

p=head_;

while

(p->next!=

null

)//按順序比較,判斷條件為短的那個鍊錶指向不為null

while

(head_!=

null)

head=head->next;

head_=head_->next;

}return true;

}

將乙個二進位制數轉化為16進製制數

常規做法

在判斷特殊情況0的基礎上,將該數除以16,得到的除數繼續重複該過程直至除數為0,得到的餘數再自下而上組合成為乙個16進製制數;

簡便做法

思路:移位運算子可以實現進製的轉換

轉換為無符號整數,在移位運算時,對符號位進行移位是沒有意義的,我們先將該數通過補碼轉換為無符號整數。補碼,也就是按位取反再加一,但用程式實現時,我們不必這麼麻煩,只需利用與運算子即可,也就是按位&1

移位,將得到的結果轉化為16進製制數,即x<<4.

class solution 

string hexstring =

"0123456789abcdef"

;while

(num!=

0&& res.

length()

<8)

return res;

}

每日一演算法

leetcode 75 號題 給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,...

每日一演算法1

插入排序 首先來解釋一下插入排序法的原理 它的原理是每插入乙個數都要將它和之前的已經完成排序的序列進行重新排序,也就是要找到新插入的數對應原序列中的位置。那麼也就是說,每次插入乙個數都要對原來排序好的那部分序列進行重新的排序,時間複雜度同樣為o n 這種演算法是穩定的排序方法。下面我用乙個圖來解釋一...

每日一演算法 A B Problem

描述give you two numbers a and b,how to know the a b s the last digit number.it looks so easy,but everybody is too lazy to slove this problem,so they re...