笔试算法训练day2

笔试算法训练day2

前言

今天是分享自己在Acwing&leetcode平台觉得质量高的题目的第二天,下面配有作者的讲解,希望能够帮助到大家
前置知识:C ++ STL中的多重集(multiset)
多重集是类似于集合容器的容器,这意味着它们以键的形式(类似于集合)以特定顺序存储值。

多重集(multiset)和集合(set)之间的主要区别在于:集合具有不同的键,这意味着没有两个键是相同的,在多重集中可以有相同的键值。
什么是multiset::count()?
multiset::count()函数是C ++ STL中的内置函数,在头文件中定义。
可用功能:计算具有特定键的元素的数量。

文章目录

1.数组中数字出现的次数
2.调整数组顺序使奇数位于偶数前面
3.堆路径(heap paths)

题面

题目:数组中数字出现的次数
数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数。

例如输入排序数组 [1,2,3,3,3,3,4,5] 和数字 3,由于 3 在这个数组中出现了 4 次,因此输出 4。

数据范围
数组长度 [0,1000]。

样例
输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3

输出:4

题目分析:这题就是一个统计问题,但是因为题目要求输出一个给定的次数出现次数,这样作者就想到了用STL来解决(机智哈哈哈),那选择哪一个STL呢,当然是multiset(多重集合),为什么呢?因为可以用.count()函数来统计次数,所以代码如下:

class Solution {
public:
    int getNumberOfK(vector<int>& nums , int k) {
        multiset<int> S;
        for(auto c:nums)
        S.insert(c);
        return S.count(k);
    }
};

题目:调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序。

使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。

数据范围
数组长度 [0,100]。

样例
输入:[1,2,3,4,5]

输出: [1,3,5,2,4]
题目分析:这题可以用双指针算法来做,用两个指针分别从首尾开始往中间走。扫描时保证第一个指针前面的数都是奇数,第二个指针后面的数都是偶数。

具体迭代操作:
第一个指针一直往后走,直到遇到第一个偶数为止;
第二个指针一直往前走,直到遇到第一个奇数为止;
交换两个指针指向的位置上的数,再进入下一层迭代,直到两个指针相遇为止;

模板的使用可以大大地提高我们的解题速度,避免很多边界问题,这里采用了acwing yxc的模板,强烈推荐哈哈哈
// 
class Solution {
public:
    void reOrderArray(vector<int> &array) {
         int l=0,r=array.size()-1;
         while(l<r){
             while(l<r&&array[l]%2==1) l++;
             while(l<r&&array[r]%2==0) r--;
             if(l<r) swap(array[l],array[r]);
         }
    }
};

题目:堆路径
在计算机科学中,堆是一种的基于树的专用数据结构,它具有堆属性:

如果 P 是 C 的父结点,则在大顶堆中 P 结点的权值大于或等于 C 结点的权值,在小顶堆中 P 结点的权值小于或等于 C 结点的权值。

一种堆的常见实现是二叉堆,它是由完全二叉树来实现的。

可以肯定的是,在大顶/小顶堆中,任何从根到叶子的路径都必须按非递增/非递减顺序排列。

你的任务是检查给定完全二叉树中的每个路径,以判断它是否是堆。

输入格式
第一行包含整数 N,表示树中结点数量。

第二行包含 N 个 不同 的整数,表示给定完全二叉树的层序遍历序列。

输出格式
对于给定的树,首先输出所有从根到叶子的路径。

每条路径占一行,数字之间用空格隔开,行首行尾不得有多余空格。

必须以如下顺序输出路径:对于树中的每个结点都必须满足,其右子树中的路径先于其左子树中的路径输出。

最后一行,如果是大顶堆,则输出 Max Heap,如果是小顶堆,则输出 Min Heap,如果不是堆,则输出 Not Heap。

数据范围
1 输入样例1:
8
98 72 86 60 65 12 23 50
输出样例1:
98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap
输入样例2:
8
8 38 25 58 52 82 70 60
输出样例2:
8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap
输入样例3:
8
10 28 15 12 34 9 8 56
输出样例3:
10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap
题目分析:这题就是一个完全二叉树的遍历,数组下标从1开始,左儿子下标=父节点下标∗2,右儿子下标=父节点下标∗2+1
然后打印搜索路径 tags:DFS(深度优先遍历 这题暴搜就完事了)
这题是acm题目模式与很多大厂笔试考察方式相同(另外大厂面试写题往往采用力扣模式,即核心代码模式)

#include<bits/stdc++.h>
using  namespace std;
const int N=1050;
int n;
int h[N];
bool lt=false,gt=false;
vector<int> path;
void dfs(int u)
{
	path.push_back(h[u]);
	if(u*2>n) 
	{
		for(int i=0;i<path.size();i++)
		{
			if(i==0) cout<<path[i];
			else cout<<" "<<path[i];
		}
		cout<<endl;
		for(int i=1;i<path.size();i++)
		{
			if(path[i]>=path[i-1])
			lt=true;
			else
			gt=true;
		}
	}
	if(u*2+1<=n) dfs(u*2+1);
	if(u*2<=n) dfs(u*2);
	path.pop_back();
}
int main() 
{
	cin>>n;
	int i;
	for(i=1;i<=n;i++)
	cin>>h[i];
	dfs(1);
	if(lt&&gt) puts("Not Heap");
	else if(lt)  puts("Min Heap");
	else puts("Max Heap");
}

总结:STL真的很重要要熟练掌握,并在合适的场景中灵活运用,DFS是很多中厂大厂笔试题目的重要考点也需要熟练掌握

你可能感兴趣的:(算法笔试训练,算法,数据结构,c++)