1. 程式人生 > >劍指Offer行榜【牛客網】練習(三)

劍指Offer行榜【牛客網】練習(三)

1、二進位制中1的個數

題目描述:
輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示

程式碼:

public class Solution {
    public int NumberOf1(int n) {
        String str = Integer.toBinaryString(n);
        int count = 0;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)=='1'){
                count++;
            }
} return count; } }

2、數值的整數次方

題目描述:
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

程式碼:

//直接呼叫函式的程式碼
public class Solution {
    public double Power(double base, int exponent) {
        return Math.pow(base,exponent);
  }
}
//手擼的程式碼
public class Solution {
    public
double Power(double base, int exponent) { double result = 1; if(exponent==0){ }else if(exponent>0){ int ex = exponent; while(ex>0){ result*=base; ex--; } }else{ int ex = -
exponent; while(ex>0){ result/=base; ex--; } } return result; } }

3、調整陣列順序使奇數在偶數之前且順序不變

題目描述:
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

程式碼:

import java.util.ArrayList;
public class Solution {
    public void reOrderArray(int [] array) {
        ArrayList<Integer> odd = new ArrayList<>();
        ArrayList<Integer> even = new ArrayList<>();
        for(int i=0;i<array.length;i++){
            if(array[i]%2==0){
                even.add(array[i]);
            }else{
                odd.add(array[i]);
            }
        }
        for(int i=0;i<odd.size();i++){
            array[i] = odd.get(i);
        }
        for(int i=0;i<even.size();i++){
            array[i+odd.size()] = even.get(i);
        }
    }
}

4、連結串列中的倒數第k個結點

題目描述:
輸入一個連結串列,輸出該連結串列中倒數第k個結點。

思路:
找到長度,得到正序length-k

注意點:
length-k<0時,返回null

程式碼:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode h = head;
        int length = 0;
        while(h!=null){
            h = h.next;
            length++;
        }
        int order = length-k;
        if(order<0){
            return null;
        }
        ListNode r = head;
        while(order>0){
            r = r.next;
            order--;
        }
        return r;
    }
}

5、連結串列翻轉

題目描述:
輸入一個連結串列,反轉連結串列後,輸出新連結串列的表頭。

思路:
1、遞迴
反轉=當前結點作為剩下部分的最後結點的next
2、非遞迴
使用兩個指標依次倒序

注意點:
遞迴方法——反轉後,當前結點的next需要置為null
非遞迴方法——先儲存next,再替換next

程式碼:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
/**
使用遞迴的演算法如下,但是複雜度太大。
*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }else{
            ListNode leftPart = ReverseList(head.next);
            ListNode l = leftPart;
            while(l.next!=null){
                l = l.next;
            }
            l.next = head;
            head.next = null;
            return leftPart;
        }
    }
}
//非遞迴
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode h1 = head;
        ListNode h2 = head;
        h1 = h1.next;
        ListNode h1next = h1.next;
        ListNode h2next = h2.next;
        h1.next = h2;
        h2.next = null;
        h1 = h1next;
        h2 = h2next;
        if(h1next==null){
            return h1;
        }
        while(h1.next!=null){
            h1next = h1.next;
            h2next = h1;
            h1.next = h2;
            h1 = h1next;
            h2 = h2next;
        }
        h1.next = h2;
        return h1;
    }
}
//非遞迴
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode node = null;
        ListNode h = head;
        while(h!=null){
            ListNode hnext = h.next;
            h.next = node;
            node = h;
            h = hnext;
        }
        return node;
    }
}