面试高频算法真题-Day01

85 阅读1分钟

面试高频算法真题-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;
}


1. 第三大数

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

581. 最短无序连续子数组

  • 给你一个整数数组 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;
}

605. 种花问题

  • 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组  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;

}