剑指offer(数值的整数次方、删除链表中的重复节点、调整数组顺序使奇数位于偶数前面)

九、代码的完整性

1. 数值的整数次方

题目描述:

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

保证base和exponent不同时为0。

思路:

需要考虑以下4种情形:

1)底数为0,指数<0;

2)底数不为0,指数<0;

3)底数不为0,指数>0;

4)底数不为0,指数=0。

代码:

public class Solution {
    public double Power(double base, int exponent) {
        if (base == 0 && exponent < 0) {
            throw new RuntimeException("非法数据!");
        }
        double result = 0;
        if (exponent < 0) {
            result = pow(base, -1 * exponent);
            return 1.0 / result;
        } else if (exponent > 0) {
            result = pow(base, exponent);
            return result;
        } else {
            return 1;
        }
    }
    public static double pow(double base, int exponent) {
        double result = 1;
        for (int i = 1; i <= exponent; i++) {
            result *= base;
        }
        return result;
    }
}

3. 删除链表中重复的节点

题目描述:

​ 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。

思路:

​ 见代码。时间复杂度O(n),空间复杂度O(1)。

代码:

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

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if (pHead == null || pHead.next == null) {
            return pHead;
        }
        //自己构造一个头结点,可以避免单独讨论当第一二两个节点便开始重复的情况
        ListNode h = new ListNode(-1);
        h.next = pHead;
        ListNode pre = h;
        ListNode p = pre.next;
        while (p != null) {
            if (p.next != null && p.val == p.next.val) {
                while (p.next != null && p.val == p.next.val) {
                    p = p.next;
                }
                //退出循环时,p.next指向第一个不重复的节点
                p = p.next;
                pre.next = p;
            } else {
                pre = pre.next;
                p = p.next;
            }
        }
        return h.next;
    }
}

6. 调整数组顺序使奇数位于偶数前面

题目描述:

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

思路:

时间复杂度O(n),空间复杂度O(n)。

代码:

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

posted @ 2020-03-14 20:32  Java程序员的进阶之路  阅读(93)  评论(0编辑  收藏  举报