剑指Offer 20 21

254 阅读1分钟

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

题目

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4] 
注:[3,1,2,4] 也是正确的答案之一。

提示:

  1. 0 <= nums.length <= 50000
  2. 1 <= nums[i] <= 10000

方法一

双指针:left指向数组左边,right指向数组右边,遍历数组,奇数放left,偶数放right。判断奇偶性用&1,计算机更喜欢。

class Solution {
    public int[] exchange(int[] nums) {
        int n = nums.length;
        for (int i = 0, j = n - 1; i < j; ) {
            if ((nums[i] & 1) == 0) {
                int temp = nums[j];
                nums[j] = nums[i];
                nums[i] = temp;
                j --;
            }else {
                i ++;
            }
        }
        return nums;
    }
}

时间复杂度: O(n)

空间复杂度: O(1)

剑指 Offer 22. 链表中倒数第k个节点

题目

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.
​
返回链表 4->5.

方法一

朴素方法:

  • 首先遍历一遍链表求出链表长度
  • 再从头节点开始遍历总长度减去k的距离,就是head要移动的距离
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        int n = 0;
        ListNode p = head;
        while(p != null) {
            p = p.next;
            n ++;
        }
        int t = n - k;
        while ((t --) != 0) head = head.next;
        return head;
    }
}

时间复杂度: O(n)

空间复杂度: O(1)