• Leetcode937. Reorder Log Files重新排列日志文件


    你有一个日志数组 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] 保证有一个标识符,并且标识符后面有一个字。

    错误:

     vector<string> Split(string x)
     {
    	 vector<string> strs;
    	 string temp = "";
    	 for (int i = 0; i < x.size(); i++)
    	 {
    		 if (i == x.size() - 1 && x[i] != ' ')
    			 temp += x[i];
    		 if (x[i] == ' ' || i == x.size() - 1)
    		 {
    			 if (temp == "")
    				 continue;
    			 strs.push_back(temp);
    			 temp = "";
    		 }
    		 else
    			 temp += x[i];
    	 }
    	 return strs;
     }
    
     bool cmp(string x, string y)
     {
    	 int i = 0, j = 0;
    	 int len1 = x.size();
    	 int len2 = y.size();
    	 for (i = 0; i < len1; i++)
    	 {
    		 if (x[i] == ' ')
    			 break;
    	 }
    	 i++;
    	 for (j = 0; j < len2; j++)
    	 {
    		 if (y[j] == ' ')
    			 break;
    	 }
    	 j++;
    	 if (x[i] >= 'a' && x[i] <= 'z' && y[j] >= '0' && y[j] <= '9')
    		 return true;
    	 else if (x[i] >= '0' && x[i] <= '9' && y[j] >= 'a' && y[j] <= 'z')
    		 return false;
    	 else if (x[i] >= 'a' && x[i] <= 'z' && y[j] >= 'a' && y[j] <= 'z')
    	 {
    		 vector<string> strx = Split(string(x.begin() + i, x.end()));
    		 vector<string> stry = Split(string(y.begin() + j, y.end()));
    		 int k = 0, l = 0;
    		 while (k < strx.size() && l < stry.size())
    		 {
    			 if (strx[k] == stry[l])
    			 {
    				 k++;
    				 l++;
    				 continue;
    			 }
    			 else
    			 {
    				 return strx[k] < stry[l];
    			 }
    		 }
    		 return strx.size() < stry.size();
    	 }
    	 else if (x[i] >= '0' && x[i] <= '9' && y[j] >= '0' && y[j] <= '9')
    		 return false;
    	 return false;
     }
    
     class Solution {
     public:
    	 vector<string> reorderLogFiles(vector<string>& logs)
    	 {
    		 sort(logs.begin(), logs.end(), cmp);
    		 return logs;
    	 }
     };

    上个错误的原因是数字构成的日志文件,有的并没有按照原来的顺序排序。所以只要把字母和数字分开再排序即可。

     vector<string> Split(string x)
     {
    	 vector<string> strs;
    	 string temp = "";
    	 for (int i = 0; i < x.size(); i++)
    	 {
    		 if (i == x.size() - 1 && x[i] != ' ')
    			 temp += x[i];
    		 if (x[i] == ' ' || i == x.size() - 1)
    		 {
    			 if (temp == "")
    				 continue;
    			 strs.push_back(temp);
    			 temp = "";
    		 }
    		 else
    			 temp += x[i];
    	 }
    	 return strs;
     }
    
     bool cmp(string x, string y)
     {
    	 int i = 0, j = 0;
    	 int len1 = x.size();
    	 int len2 = y.size();
    	 for (i = 0; i < len1; i++)
    	 {
    		 if (x[i] == ' ')
    			 break;
    	 }
    	 i++;
    	 for (j = 0; j < len2; j++)
    	 {
    		 if (y[j] == ' ')
    			 break;
    	 }
    	 j++;
    	vector<string> strx = Split(string(x.begin() + i, x.end()));
    	vector<string> stry = Split(string(y.begin() + j, y.end()));
    	int k = 0, l = 0;
    	while (k < strx.size() && l < stry.size())
    	{
    		if (strx[k] == stry[l])
    		{
    			k++;
    			l++;
    			continue;
    		}
    		else
    		{
    			return strx[k] < stry[l];
    		}
    	}
    	return strx.size() < stry.size();
     }
    
     class Solution {
     public:
    	 vector<string> reorderLogFiles(vector<string>& logs)
    	 {
    		 vector<string> ans;
    		 vector<string> strs;
    		 vector<string> nums;
    		 int len = logs.size();
    		 for (int i = 0; i < len; i++)
    		 {
    			 int len2 = logs[i].size();
    			 int  j;
    			 for (j = 0; j < len2; j++)
    			 {
    				 if (logs[i][j] == ' ')
    					 break;
    			 }
    			 j++;
    			 if (logs[i][j] >= 'a' && logs[i][j] <= 'z')
    			 {
    				 strs.push_back(logs[i]);
    			 }
    			 else
    			 {
    				 nums.push_back(logs[i]);
    			 }
    		 }
    		 sort(strs.begin(), strs.end(), cmp);
    		 for (int i = 0; i < strs.size(); i++)
    		 {
    			 ans.push_back(strs[i]);
    		 }
    		 for (int i = 0; i < nums.size(); i++)
    		 {
    			 ans.push_back(nums[i]);
    		 }
    		 return ans;
    	 }
     };
  • 相关阅读:
    ASP.NET 实现验证码以及刷新验证码
    使用纯生js操作cookie
    TesseractOCR Tutorials
    c# 解析JSON的几种办法
    ElasticSearch常用查询命令-kibana中使用
    ElasticSearch集成IK分词器
    Typora使用教程 之 PicGo集成做图床
    Kibana-CentOS7单机安装测试
    Elasticsearch-CentOS7单机安装测试
    CentOS7安装JDK8
  • 原文地址:https://www.cnblogs.com/lMonster81/p/10433769.html
Copyright © 2020-2023  润新知