四、劍指 Offer(15~19)
阿新 • • 發佈:2020-12-26
技術標籤:劍指 Offer
文章目錄
一、15 二進位制中 1 的個數
1.演算法描述
請實現一個函式,輸入一個整數(以二進位制串形式),輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函式輸出 2。
2.演算法題解
方法一:逐位判斷
根據 與運算 定義,設二進位制數字 n,則有:
- 若 n & 1 = 0 則 n 二進位制的最右一位為 0
- 若 n & 1 = 1 則 n 二進位制的最右一位為 1
演算法流程:
- 初始化數量統計變數 res = 0。
- 迴圈逐位判斷:當 n = 0 時跳出。
- 若 n & 1 = 1 則統計數 resres 加一,將二進位制數字 n 無符號右移一位。
- 返回統計數量 res。
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res += n & 1;
n >>>= 1;
}
return res;
}
}
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
res++;
n &= n - 1;
}
return res;
}
}
二、16 值的整數次方
1.演算法描述
實現函式double Power(double base, int exponent),求base的exponent次方。不得使用庫函式,同時不需要考慮大數問題。
2.演算法題解
三、17 列印從1到最大的n位數
1.演算法描述
輸入數字 n,按順序打印出從 1 到最大的 n 位十進位制數。比如輸入 3,則打印出 1、2、3 一直到最大的 3 位數 999。
2.演算法題解
最大的 n 位數(記為 end )和位數 n 的關係:end = 10^n - 1
例如最大的 1 位數是 9 ,最大的 2 位數是 99 ,最大的 3 位數是 999。
class Solution {
public int[] printNumbers(int n) {
int end = (int) (Math.pow(10, n) - 1);
int[] res = new int[end];
for (int i = 0; i < res.length; i++) {
res[i] = i + 1;
}
return res;
}
}
四、18 刪除連結串列的節點
1.演算法描述
給定單向連結串列的頭指標和一個要刪除的節點的值,定義一個函式刪除該節點,返回刪除後的連結串列的頭節點。
2.演算法題解
使用單指標的方式
- 首先處理特殊情況,head 為 null 或者刪除的節點為 head 的情況。
- 然後遍歷這個連結串列,找到要刪除的節點。
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if (head == null) {
return head;
}
if (head.val == val) {
return head.next;
}
ListNode cur = head;
while (cur.next != null && cur.next.val != val) {
cur = cur.next;
}
if (cur.next != null) {
cur.next = cur.next.next;
}
return head;
}
}
五、19 正則表示式匹配
1.演算法描述
請實現一個函式用來匹配包含’. ‘和’‘的正則表示式。模式中的字元’.‘表示任意一個字元,而’'表示它前面的字元可以出現任意次(含0次)。在本題中,匹配是指字串的所有字元匹配整個模式。
例如,字串"aaa"與模式"a.a"和"abaca"匹配,但與"aa.a"和"ab*a"均不匹配。
2.演算法題解