这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
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)