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,动态规划的题目。这个输入输出让人非常迷惑,题目描述说的是两行,输入两行数字,示例却给的…,做了几小时,不会做,放弃。┭┮﹏┭┮