问题: 重新排列日志文件
你有一个日志数组 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 <= 1003 <= logs[i].length <= 100logs[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,再忙都应该抽出时间,哪怕做一个简单的题。
原文:https://www.cnblogs.com/youdias/p/9942591.html