1. 程式人生 > >Leetcode937. Reorder Log Files重新排列日誌檔案

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;
	 }
 };