調整數組順序使奇數位於偶數前面
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
思路:參考快速排序
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;
}
};