刷题记录06-大疆2023秋招C++开发工程师

01 文件搜索

题目描述

先要构建一颗文件树,再在文件树中把含有关键字的路径输出。
第一行输入要搜索的关键字
第二行输入树的结点数量N
再N行都是树的结点值
用-代表一级目录,–代表二级目录,依次类推。

示例

输入
3
11
root/
-file1/
–text1.txt
–text2.txt
-file2/
–text3.txt
-file3/
–text4.txt
–text5.txt
-file4/
–text6.txt
输出
/root/file3/
/root/file2/text3.txt

思路

先写一颗N叉数,构建树,这里文件级数就要通过几个-来获得,并获得父结点,最后深度遍历寻找key,找到路径就放到输出中。

代码

/// 文件搜索
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 树结点
struct Node {
	string value;
	vector<Node*> children;
	Node(string v) :value(v) {};
};

vector<string> ret;   // 存放结果
void dfs(Node* root, string& key, string& path) {
	if (root == nullptr)
		return;
	if (root->value.find(key) != string::npos) {// 找到关键字
		int size = path.size();
		path += root->value;
		ret.push_back(path);   // 这里不能return, 子路径中可能还有key
		path = path.substr(0, size);
	}
	for (int i = 0; i < (int)root->children.size(); ++i) {
		int size = path.size();
		path += root->value;
		dfs(root->children[i], key, path);
		path = path.substr(0, size);
	}
}

int main() {
	// 关键字
	string keywords;
	getline(cin, keywords);
	int num;  // 结点个数
	cin >> num;
	vector<Node*> nodes(num+1);
	// 放根结点
	Node* root = new Node("/");
	nodes[0] = root;
	vector<int> last(num+1);    // 每一次获得的,记录当前的上一级
	last[1] = 0;              // 第一层的父结点是0

	// 建立树
	for (int i = 1; i < num+1; ) {
		string tmp;
		cin >> tmp;
		int j = 0; 
		int layer = 1;            // 层数
		while (tmp[j] == '-') {
			layer++;
			j++;
		}
		// 去 - 
		Node* node = new Node(tmp.substr(layer-1));
		// 把这一个连接到上一层的子,并把当前node存到nodes中
		// 父结点 添加 孩子结点
		nodes[last[layer]]->children.push_back(node);
		// 当前结点放到 nodes中
		nodes[i] = node;
		// 第 layer+1 层的父结点 更新 为 i
		last[layer+1] = i;
		++i;   // 下一个
	}
	// 深度查找
	string path;  // 含有查找结果的 路径
	dfs(nodes[0], keywords, path);
	if(ret.size()==0){ // 没找到
		cout << "FILES NOT FOUND!" <<endl;
		return 0;
	}
	for (auto i : ret)cout << i << endl;
	return 0}

测试

总结

总的来说,思路是这个思路,但是使用赛马网做的题目,没有用自己的IDE(没有写能用就没有用),根本没有办法调试,自己呢也不是那种一次就能把代码写的很完美不出错的人,也不知道这串代码的正确性,做题的时候是通过率0%,这是笔试之后复盘写的调试过的,应该给的测试用例是能通过的,也不知道还有哪些测试用例,不能打断点调试就是废人,也不知道问题出在哪儿,哎还是水平太差了,道阻且长哦。

02 使数组严格递增

给你两个整数数组 arr1 和 arr2,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。

每一步「操作」中,你可以分别从 arr1 和 arr2 中各选出一个索引,分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,然后进行赋值运算 arr1[i] = arr2[j]。
如果无法让 arr1 严格递增,请返回 -1。
用arr2中的数去换arr1中的数,使得arr1严格递增。问替换的最小次数,没有就返回-1。

示例

输入
scores1 = [ 81, 82, 85, 84, 87]
scores2 = [86, 82, 84, 83]
输出
1

思路

咋一看吧,像是单调栈,考后看了是 leetcode1187,动态规划的题目。这个输入输出让人非常迷惑,题目描述说的是两行,输入两行数字,示例却给的…,做了几小时,不会做,放弃。┭┮﹏┭┮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值