剑指offer(11-15)

JZ11

问题描述:

输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。

思路:

  • 使用一个计数器32,遍历每个位置的元素
  • 将当前数和1相与,如果当前的低位是1,那么相与的结果为1,如果当前低位是0,那么相与的结果为0;
  • 然后使用一个res变量记录当前位置为1的个数

代码:

public class Solution {
    public int NumberOf1(int n) {
        int res = 0;
        for(int i = 0; i < 32; i++) {
            if((n & 1) == 1) {
                res++;
            }
            n = n >> 1;
        }
        return res;
    }
}

JZ12

问题描述:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

保证base和exponent不同时为0

思路:

  • 考虑正负号
  • 当exponent为正数的时候,直接while循环相乘即可
  • 当exponent为负数的时候,首先必须将exponent取正,然乎while求出累计和之后,求倒数即可

代码:

public class Solution {
    public double Power(double base, int exponent) {
        if(base == 0) return 0;
        if(exponent == 0) return 1;
        boolean f = exponent > 0 ? true : false;
        exponent = Math.abs(exponent);
        double res = 1;
        while(exponent-- > 0) {
            res *= base;
        }
        return f ? res : 1 / res;
    }
}

JZ13

问题描述:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路一:

  • 创建一个辅助数组
  • 第一次遍历原始数组的时候,将所有的奇数值加入数组
  • 第二次遍历数组的时候,将所有的偶数值加入数组
  • 第三次遍历将辅助数组中的所有元素全部放入原始数组中

思路二:

  • 使用冒泡排序的思想(每次都是把最后面的偶数沉到数组底部)
  • 每次遍历到奇数的时候跳过
  • 当前位置是偶数且他下一个数也是偶数,跳过
  • 当前位置是偶数且他下一个数是奇数,则交换当前的数和他下一个数

代码:

// 思路一:
public class Solution {
    public void reOrderArray(int [] array) {
        int n = array.length;
        int[] t = new int[n];
        int index = 0;
        for(int i = 0; i < n; i++) {
            if((array[i] & 1) == 1) {
                t[index++] = array[i];
            }
        }
        for(int i = 0; i < n; i++) {
            if((array[i] & 1) == 0) {
                t[index++] = array[i];
            }
        }
        for(int i = 0; i < n; i++) {
            array[i] = t[i];
        }
    }
}

// 思路二:
public class Solution {
    public void reOrderArray(int [] array) {
        int n = array.length;
        for(int i = n - 1; i > 0; i--) {
            for(int j = 0; j < i; j++) {
                if((array[j] & 1) == 0 && ((array[j + 1] & 1) == 1)) {
                    swap(array, j, j + 1);
                }
            }
        }
    }
    
    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

JZ14

问题描述:

输入一个链表,输出该链表中倒数第k个结点。

思路一:

  • 首先让一个指针t先走k步
  • 然后让r从head开始,和t指针同时向后走,如果t指针到null的时候,然后r指针即可

代码:

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode t = head;
        while(k-- > 0) {
            if(t == null) return null;
            t = t.next;
        }
        ListNode r = head;
        while(t != null) {
            r = r.next;
            t = t.next;
        }
        return r;
    }
}

JZ15

问题描述:

输入一个链表,反转链表后,输出新链表的表头。

思路一:

  • 遍历的方式实现

代码:

public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode pre = null, next = null;
        while(head != null) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
}

你可能感兴趣的:(剑指offer(11-15))