原創 5.7打卡:劍指 offer兩題:調整數組/鏈表中倒數第k個節點

調整數組順序使奇數位於偶數前面

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

思路:參考快速排序

  • i++往前走碰到偶數停下來,j = i+1
  • a[j]爲偶數,j++前進,直到碰到奇數
    • a[j]對應的奇數插到a[i]位置,j經過的j-i個偶數依次後移
  • 如果j==len-1時還沒碰到奇數,證明ij之間都爲偶數了,完成整個移動

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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章