1. 程式人生 > 其它 >四、劍指 Offer(15~19)

四、劍指 Offer(15~19)

技術標籤:劍指 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.演算法題解