面试高频算法真题-Day01
- 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
#include <iostream>
using namespace std;
struct myList {
int val;
myList* next;
myList(int _val) :val(_val), next(nullptr) {}
};
myList* merge(myList* l1, myList* l2) {
if (l1 == nullptr) return l2;
if (l2 == nullptr) return l1;
myList head(0);
myList* node = &head;
while (l1 != nullptr && l2 != nullptr) {
if (l1->val < l2->val) {
node->next = l1;
l1 = l1->next;
}
else {
node->next = l2;
l2 = l2->next;
}
node = node->next;
}
if (l1 == nullptr)
node->next = l2;
if (l2 == nullptr)
node->next = l1;
return head.next;
};
int main(void) {
myList* node0 = new myList(0);
myList* node1 = new myList(1);
myList* node2 = new myList(2);
myList* node3 = new myList(3);
myList* node4 = new myList(1);
myList* node5 = new myList(4);
node0->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = nullptr;
node4->next = node5;
node5->next = nullptr;
auto node = merge(node0, node4);
while (node != nullptr) {
cout << node->val << endl;
node = node->next;
}
return 0;
}
int thirdMax(vector<int>& nums) {
long long firstNum = LONG_MIN,secondNum = LONG_MIN,thirdNum = LONG_MIN;
for (auto& a : nums) {
if (firstNum < a) {
thirdNum = secondNum;
secondNum = firstNum;
firstNum = a;
}
else if (firstNum > a && secondNum < a) {
thirdNum = secondNum;
secondNum = a;
}
if (secondNum > a && thirdNum<a ) {
thirdNum = a;
}
}
if (thirdNum == LONG_MIN)
return firstNum;
else
return thirdNum;
}
- 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。
int findUnsortedSubarray(vector<int>& nums) {
if (nums.size() <= 1) return 0;
int len=nums.size(),low = 0, high = len - 1, maxNum = nums[0], minNum = nums[len - 1];
for (int i = 1; i < len; i++) {
maxNum = max(maxNum, nums[i]);
minNum = min(minNum, nums[len - 1 - i]);
if (nums[i] < maxNum) low = i;
if (nums[len - 1 - i] > minNum) high = len - 1 - i;
}
return low > high ? low - high + 1 : 0;
}
- 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
unordered_map<int, int> res;// 0/1,count
res[0] = 0;
res[1] = 0;
size_t i = 0;
while (i < flowerbed.size() && flowerbed[i] == 0 ) {
res[0] ++;
i++;
}
if (i == flowerbed.size()) {//全是 0
return (res[0] + 1) / 2>=n;
}
int plantFlower = res[0] / 2;//遇到1了,此时flowerbed[i] = 1
res[1] = 1;
res[0] = 0;
i++;
for (; i < flowerbed.size();++i ) {
res[flowerbed[i]] += 1;
if (res[1] == 2) {
//countZero = res[0];
plantFlower += (res[0] - 1) / 2;
res[1] = 1;
res[0] = 0;
}
}
if (res[1] == 2) {
//countZero = res[0];
plantFlower += (res[0] - 1) / 2;
}
else if (res[1] == 1) {
//countZero = res[0];
plantFlower += res[0] / 2;
}
return plantFlower >= n;
}