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"]

提示:

  1. 0 <= logs.length <= 100
  2. 3 <= logs[i].length <= 100
  3. 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,再忙都应该抽出时间,哪怕做一个简单的题。

猜你喜欢

转载自www.cnblogs.com/youdias/p/9942591.html