LeetCode937
Posted youdias
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode937相关的知识,希望对你有一定的参考价值。
问题: 重新排列日志文件
你有一个日志数组 logs
。每条日志都是以空格分隔的字串。
对于每条日志,其第一个字为字母数字标识符。然后,要么:
- 标识符后面的每个字将仅由小写字母组成,或;
- 标识符后面的每个字将仅由数字组成。
我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。
将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按字母顺序排序,忽略标识符,标识符仅用于表示关系。数字日志应该按原来的顺序排列。
返回日志的最终顺序。
示例 :
输入:["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"] 输出:["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
提示:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
logs[i]
保证有一个标识符,并且标识符后面有一个字。
链接:https://leetcode-cn.com/contest/weekly-contest-110/problems/reorder-log-files/
分析:
首先将忽略标志符后的字符串分类,数字原来顺序保存,字母进行排序,组合答案输出即可
忽略标志符:第一个空格前是标志,忽略即可。
数字字母区分:由于标志符后要么仅有数字构成,要么仅有小写字母构成,获取一个字符判断即可。
字母log排序:将每一条log分为tag和内容两部分,用pair存储,通过自定义排序对比内容部分即可。
AC Code:
bool cmp2(pair<string, string> a, pair<string, string> b) { return a.second < b.second; } class Solution { public: vector<string> reorderLogFiles(vector<string>& logs) { vector<string> ret; vector<vector<string> >tmp = GetNumAndChar(logs); vector<string> nums = tmp[0]; vector<string> chars = tmp[1]; chars = SortString(chars); for (int i = 0; i < chars.size(); i++) { ret.emplace_back(chars[i]); } for (int i = 0; i < nums.size(); i++) { ret.emplace_back(nums[i]); } return ret; } //将源数据分为数字字母两部分 vector<vector<string> > GetNumAndChar(vector<string> input) { vector<vector<string> > ret; vector<string> nums; vector<string> chars; for (int i = 0; i < input.size(); i++) { string tmpstr = input[i]; if (GetLogKind(tmpstr) == 0) { nums.emplace_back(tmpstr); } else { chars.emplace_back(tmpstr); } } ret.emplace_back(nums); ret.emplace_back(chars); return ret; } pair<string, string> Splitlog(string log) { pair<string, string> ret; string tag=""; string content; for (int i = 0; i < log.size(); i++) { if (log[i] != ‘ ‘) { tag += log[i]; } else { break; } } content = log.substr(tag.size(), log.size() - tag.size()); ret = make_pair(tag, content); return ret; } //获得log类型,如果返回0说明是数字,如果返回1,说明是字符 //忽略第一个空格前内容 int GetLogKind(string log) { int ret = -1; pair<string, string> tmp = Splitlog(log); if (‘0‘ <= tmp.second[1] && ‘9‘ >= tmp.second[1]) { ret = 0; } else { ret = 1; } return ret; } //字母排序 vector<string> SortString(vector<string> input) { vector < string > ret; vector<pair<string, string> > tmpvec; for (int i = 0; i < input.size(); i++) { pair<string, string> local = Splitlog(input[i]); tmpvec.emplace_back(local); } sort(tmpvec.begin(), tmpvec.end(), cmp2); for (int i = 0; i < tmpvec.size(); i++) { string tmp = tmpvec[i].first + tmpvec[i].second; ret.emplace_back(tmp); } return ret; } };
其他:
1.过程想到尝试使用lambda表达式直接对数组进行过滤筛选,可惜没在C++上面真正用过,对lambda也仅仅限于了解程度,没真正用来做过事情,需要弥补
2.简单的题都换了将近半小时,速度太慢了,回顾上一周,除了上个周日周赛,期间没做一个LeetCode,再忙都应该抽出时间,哪怕做一个简单的题。
以上是关于LeetCode937的主要内容,如果未能解决你的问题,请参考以下文章
leetcode937. Reorder Log Files
LeetCode 937 Reorder Log Files 解题报告
[LeetCode] 937. Reorder Data in Log Files