Leetcode937. Reorder Log Files重新排列日誌檔案
阿新 • • 發佈:2019-01-12
你有一個日誌陣列 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] 保證有一個識別符號,並且識別符號後面有一個字。
錯誤:
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; } };