调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:参考快速排序
i++
往前走碰到偶数停下来,j = i+1
- 若
a[j]
为偶数,j++
前进,直到碰到奇数a[j]
对应的奇数插到a[i]位置,j
经过的j-i
个偶数依次后移
- 如果
j==len-1
时还没碰到奇数,证明i
和j
之间都为偶数了,完成整个移动
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
if(len <= 1) return;//数组空或者长度为1直接return
int i = 0;
while(i<len)
{
int j = i + 1;
if(array[i]%2 == 0)//a[i]为偶数,j前进,直到替换
{
while(array[j]%2==0)
{
if(j == len - 1) return;
j ++;
}
//退出while循环此时j为奇数
int count = j - i;
int temp = array[i];
array[i] = array[j];//将奇数放前面
while(count > 1)
{
//注意后移就是count + i - 1位置移到count + i位置
array[count + i] = array[i + count - 1];//数组后移
count --;
}
array[i+1] = temp;
}
i ++;
}
}
};
链表中倒数第k个节点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路:严格的O(n)解法,快慢指针
参考:
首先让快指针先行k步,然后让快慢指针每次同行一步,直到快指针指向空节点,慢指针就是倒数第K个节点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (!pListHead || k <= 0) return nullptr;
auto slow = pListHead, fast = pListHead;
while(k --)
{
if(fast) fast = fast->next;
else return nullptr;//如果单链表长度<K,直接返回
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
};