开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!
牛客网-剑指offer
1、调整数组顺序使奇数位于偶数之前
描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并且保证奇数和奇数、偶数和偶数之间的相对位置不变。
思路1:运用
S
T
L
STL
STL 的
s
t
a
b
l
e
−
p
a
r
t
i
t
i
o
n
stable-partition
stable−partition 这个函数模板
该函数的功能为:isOK为真就放在数组之前,假的就放在数组之前,真的就放在数组之后,这个函数是非常有用滴!
测试代码:
#include <algorithm>
class Solution {
public:
bool isOk(int n){
return (n%2 == 1); //奇数返回真
}
void reOrderArray(vector<int> &array) {
stable_partition(array.begin(),array.end(),isOk);
}
};
思路2:类似冒泡排序,前偶后奇就交换。
测试代码:
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
void reOrderArray(vector<int> &array) {
for (int i = 0; i < array.size(); i++) {
for (int j = array.size() - 1; j > i; j--) {
if (array[j] % 2 == 1 && array[j - 1] % 2 == 0) { //前偶后奇交换
swap(array[j], array[j - 1]);
}
}
}
}
};
思路3:再创建一个新数组,遇见偶数,就保存到新数组中,同时从原数组中删除。
测试代码:
#include <vector>
using namespace std;
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> array_temp;
vector<int>::iterator ib1, ie1;
ib1 = array.begin();
for (; ib1 != array.end();) {
if (*ib1 % 2 == 0) {
array_temp.push_back(*ib1);
ib1 = array.erase(ib1);
}
else{
ib1++;
}
}
vector<int>::iterator ib2, ie2;
ib2 = array_temp.begin();
ie2 = array_temp.end();
//将新数组添加到老数组里面
for (; ib2 != ie2; ib2++) {
array.push_back(*ib2);
}
}
};
2、链表中倒数第K个结点
描述:输入一个链表,输出该链表中倒数第K个结点。
思路:
- 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点;
- 然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了;
- 因为第一个条件保证他们相差K,因此第一个到最后,第二个就是倒数K个;
测试代码:
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if (pListHead == NULL)
return pListHead;
if (k == 0)
return NULL;
ListNode* kth = NULL, *begin = pListHead; //begin为头节点
int count = 1;
while (begin!=NULL){
if (count++ == k) {
kth = pListHead; //count累加到 K 个值
}
else{
if (count > k) {
kth = kth->next; //第二个继续往后走
}
}
begin = begin->next; //第一个一直走
}
return kth;
}
};