题目描述:
给你一个日志数组 logs。每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 。
有两种不同类型的日志:
字母日志:除标识符之外,所有字均由小写字母组成
 数字日志:除标识符之外,所有字均由数字组成
 请按下述规则将日志重新排序:
所有 字母日志 都排在 数字日志 之前。
 字母日志 在内容不同时,忽略标识符后,按内容字母顺序排序;在内容相同时,按标识符排序。
 数字日志 应该保留原来的相对顺序。
 返回日志的最终顺序。
分析:
题目大意
 要求我们按照特定的格式重新排序日志。
日志 的格式是第一个单词是 日志 的 标识符,后面的都是 日志 的内容。
 有两种 日志,一种内容是纯数字的(数字日志),一种内容是纯英文字符的(字母日志)。

要求的排序规则:
把所有的英文 日志 放到数字 日志 前面。
 而且如果是字母日志,需要按照内容对 日志 进行排序,当内容相同的时候按照标识符排序;
 如果是数字 日志,保持原来的顺序。

拆分和排序
 看起来题目很长,但是只要是字符串处理题,对于 python 都很简单。
我用了两个列表,分别存储字母日志和数字日志,先分别排序,再拼接到一起。
首先需要进行分割成标识符和内容;
 对内容的第一个单词进行判断:
 如果是英文字符串,说明是字母日志,那么把内容和标识符构成 元组 放到 letters 的列表里;
 如果是数字字符串,说明是数字日志,那么直接把当前的这个日志放到 nums 列表里。
 然后我们需要对 letters进行排序:因为 元组 里首先是内容,然后是标识符,所以 sort()会先对内容进行排序,然后再对标识符进行排序。
 从 letters排序的结果中提取出所有的内容,并与 nums 拼接在一起,返回即可。
python代码:
class Solution(object):
     def reorderLogFiles(self, logs):
         """
         :type logs: List[str]
         :rtype: List[str]
         """
         letters = []
         nums = []
         for log in logs:
             logsplit = log.split(" ")
             if logsplit[1].isalpha():
                 letters.append((" ".join(logsplit[1:]), logsplit[0]))
             else:
                 nums.append(log)
         letters.sort()
         return [letter[1] + " " + letter[0] for letter in letters] + nums
c++代码:
class Solution {
 public:
     vector<string> reorderLogFiles(vector<string>& logs) {
         stable_sort(logs.begin(), logs.end(), [&](const string & log1, const string & log2) {
             int pos1 = log1.find_first_of(" ");
             int pos2 = log2.find_first_of(" ");
             bool isDigit1 = isdigit(log1[pos1 + 1]);
             bool isDigit2 = isdigit(log2[pos2 + 1]);
             if (isDigit1 && isDigit2) {
                 return false;
             }
             if (!isDigit1 && !isDigit2) {
                 string s1 = log1.substr(pos1);
                 string s2 = log2.substr(pos2);
                 if (s1 != s2) {
                     return s1 < s2;
                 }
                 return log1 < log2;
             }
             return isDigit1 ? false : true;
         });
         return logs;
     }
 };










