一些常用的算法操作,方法與技巧

1.找列表的中點

可以使用快慢指針,一個指針步進1,另一個指針步進2。可用於數組或者鏈表。

對於數組

[1, 2, 3, 4]
i1 = 0; // 每次步進1
i2 = 0; // 每次步進2

// 第一次
i1 = 1;
i2 = 2;
if (i2 >= arr.length - 1)  // 檢查i2是否到達尾部,或者超過尾部

// 第二次
i1 = 2;
i2 = 4;
if (i2 >= arr.length - 1)  // 檢查i2是否到達尾部,或者超過尾部,因爲arr.length = 4,所以已經出國了尾部,退出循環

i1 = 2 即使數組的中點。

 |     |
[1, 2, 3, 4]

再來看看奇數長度數組的情況
[1, 2, 3, 4, 5]
i1 = 0;
i2 = 0;

i1 = 1;
i2 = 2;

i1 = 2;
i2 = 4;

2.反轉鏈表

1->2->3->4->null
4->3->2->1->null

我們需要將後面的指針保存下來就可以逐一的改變鏈接,用流程圖表示一下:
在這裏插入圖片描述
用代碼表示爲:

public Node reserveList(Node head) {
	Node prev = null;
	Node node = head;
	Node temp;
	while (node != null) {
		temp = node.next;
		node.next = prev;
		prev = node;
		node = temp;
	}
	return prev;
}

3.位操作

3.1. n & (n - 1)

這個操作可以將n的二進制最右邊的1消除。舉個栗子,比如5,二進制位101,那麼 5 & 4 會怎麼樣呢?

101
100
--------
100

最右側的1被消去了。如果我們再來一遍。

100
011
--------
000

100最右側的1被消去了,變成了0。

以上就是我對這個操作的直觀理解,那麼它有什麼作用呢。
1.數一個數二進制有多少個1。
給我一個數,然後不停的讓n & n - 1,再將結果賦值給n,並計數,判斷啥時候n爲0了,計數君就是1的個數了。
2.判斷一個數字是否是2的冪。
2的冪在二進制上有個特點,就是100000…0000這種形式,那麼只需要 n & n - 1,如果結果是0,那麼它就是2的冪了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章