记录一次华为od题
一、箱子之形摆放
题目描述:
要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为n的空地上,输出箱子的摆放位置,例如:箱子ABCDEFG,空地宽为3,摆放效果如下图:
则输出结果为:
AFG
BE
CD
输入: 一行字符串,通过空格分割两部分,前面str部分表示箱子的字符串由数字或字母组成,后面部分是表示宽度的数字n,如下: ABCDEFG 3 输出: AFG BE CD
注:最后一行不得输出额外的空行
str只包含数字和数字,1<=len(str)<=1000,1<=n<=1000。
#include <iostream> #include <string> #include <vector> using namespace std; void solution(string s, int width) { if (width < 2) cout << s; int index=0; bool flag = true; vector<string> st(3, ""); for (auto ch : s) { if (index == -1) { index = 0; flag = true; } if (index == width) { index--; flag = false; } st[index]+=ch; if (flag) index++; else index--; } for (auto str : st) cout << str << endl; } int main() { int width; string in; cin >> in >> width; solution(in, width); return 0; }
上面是构建了一个存三个字符串的数组,然后有index作为控制,迭代处理字符串s,当index递增到宽度上限,就反过来递减,当index递减到宽度下限,就再反过来递增。类似的题目是z字形字符串:
[leetcode地址](https://leetcode.cn/problems/zigzag-conversion/)
牛客上的是:NC344 Z字形输出字符串
二、微服务的集成测试
描述:有n个容器服务,容器的启动可能有依赖性,也可能没有,另外,服务的启动需要一定的时间加载,给一个nxn的二维矩阵useTime,useTime的值具有特定意义,useTime[i][i]表示服务i+1的启动需要的时间,useTime[i][j]=1表示服务i+1的启动需要依赖服务j+1,useTime[i][j]=0表示服务i+1的启动不依赖于服务j+1,需要得出服务k的最短启动时间。
三、快递业务站
描述:
有n个快递点,快递点A、B可中装快递,就可以认为A-B可达,如果A-B可达且B-C可达,则A-C可达。针对n个快递站进行编号:0、1、2.。。。。。。n-1,s[i][j]来表示i-j是否可达,值为1表示可达,值为0则是不可达,所以输入是一个二维矩阵,需要计算出至少选择从几个主站点出发,才能达到所有站点。
注:s[i][j]==s[j][i],第一行输入是快递点数量也是二维矩阵的维数。
输入: 4 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 输出: 1
说明:选择0站点为主站点可到达所有站点。
输入: 4 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 输出: 3
说明:
选择0站点为主站点可以覆盖0、1站点,
选择2站点为主站点可以覆盖2站点,
选择3站点为主站点可以覆盖3站点,
所以需要至少三个站点为主站点可以覆盖所有站点。
解:
#include <iostream> #include <vector> #include <unordered_set> using namespace std; int solution(vector<vector<int>> vec, int n) { if (n < 2) return 1; int cnt = 0, i, j; unordered_set<int> st; for (i = 0; i < n; i++) { if (st.find(i) != st.end()) { cnt++; } vector<int> tmp = vec[i]; for (j = 0; j < tmp.size(); j++) { if (tmp[j] == 1) st.insert(j); } } return cnt; } int main() { int n, tmp, i, j; cin >> n; vector<vector<int>> st; for (i = 0; i < n; i++) { vector<int> t; for (j = 0;j<n;j++) { cin >> tmp; t.push_back(tmp); } st.push_back(t); } cout << solution(st, n) << endl; return 0; }
----------------------------------------------------------
得到网友资助,更新一下第二题,原定描述不变,添加一下输入和输出描述:
输入: 第一行是代表二维矩阵维数的数字n,后面是对应二维矩阵,最后一行数字,代表服务k 3 5 0 0 1 5 0 0 1 5 3 输出: 15
根据java解法思路稍微改动,解答如下:
#include <iostream> #include <vector> #include <queue> using namespace std; void solution(vector<vector<int>> vec, int n, int index) { vector<vector<int>> upstream(n); int i, j, res=vec[index][index]; //初始化前置任务 for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (i != j && vec[i][j] == 1) upstream[i].push_back(j); //保存服务列表 queue<vector<int>> sq; sq.push(upstream[index]); while (sq.size() > 0) { vector<int> upstream_tasks = sq.front(); sq.pop(); vector<int> services; int size = upstream_tasks.size(), res_tmp=0; for (i = 0; i < size; i++) { res_tmp = max(res_tmp, vec[i][i]); for (j = 0; j < upstream[upstream_tasks[i]].size(); j++) services.push_back(upstream[upstream_tasks[i]][j]); } res += res_tmp; if (services.size() > 0) sq.push(services); } cout << res << endl; } int main() { int n, tmp, i, j, k; cin >> n; vector<vector<int>> st; for (i = 0; i < n; i++) { vector<int> t; for (j = 0;j<n;j++) { cin >> tmp; t.push_back(tmp); } st.push_back(t); } cin >> k; k--; solution(st, n, k); return 0; }
稍微魔改后的解法,只过了上面的范例,因为也没有其他范例可以尝试了,没有考虑高效与否并且建立在给入n、二维矩阵和k合规的情况,放到实际肯定要考虑invalid。最后,感谢网友的分享,万分感谢。
记录我的求职和面试经历,为后面复盘做准备