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

 

转载于:https://www.cnblogs.com/lMonster81/p/10433769.html

### 如何在 VSCode 中安装配置 LeetCode 插件以及 Node.js 运行环境 #### 安装 LeetCode 插件 在 VSCode 的扩展市场中搜索 `leetcode`,找到官方提供的插件并点击 **Install** 按钮进行安装[^1]。如果已经安装过该插件,则无需重复操作。 #### 下载与安装 Node.js 由于 LeetCode 插件依赖于 Node.js 环境,因此需要下载并安装 Node.js。访问官方网站 https://nodejs.org/en/ 并选择适合当前系统的版本(推荐使用 LTS 版本)。按照向导完成安装流程后,需确认 Node.js 是否成功安装到系统环境中[^2]。 可以通过命令行运行以下代码来验证: ```bash node -v npm -v ``` 上述命令应返回对应的 Node.js npm 的版本号。如果没有正常返回版本信息,则可能未正确配置环境变量。 #### 解决环境路径问题 即使完成了 Node.js 的安装,仍可能出现类似 “LeetCode extension needs Node.js installed in environment path” 或者 “command ‘leetcode.toggleLeetCodeCn’ not found” 的错误提示[^3]。这通常是因为 VSCode 未能识别全局的 Node.js 路径或者本地安装的 nvm 默认版本未被正确加载[^4]。 解决方法如下: 1. 手动指定 Node.js 可执行文件的位置 在 VSCode 设置界面中输入关键词 `leetcode`,定位至选项 **Node Path**,将其值设为实际的 Node.js 安装目录下的 `node.exe` 文件位置。例如:`C:\Program Files\nodejs\node.exe`。 2. 使用 NVM 用户管理工具调整默认版本 如果通过 nvm 工具切换了不同的 Node.js 版本,请确保设置了默认使用的版本号。可通过以下指令实现: ```bash nvm alias default <version> ``` 重新启动 VSCode 后测试功能键是否恢复正常工作状态。 --- #### 配置常用刷题语言 最后一步是在 VSCode 设置面板中的 LeetCode 插件部分定义个人习惯采用的主要编程语言作为默认提交方式之一。这样可以减少频繁修改编码风格的时间成本。 --- ### 总结 综上所述,要在 VSCode 上顺利启用 LeetCode 插件及其关联服务,除了基本插件本身外还需额外准备支持性的后台框架——即 Node.js 应用程序引擎;同时针对特定场景下产生的兼容性障碍采取针对性措施加以修正即可达成目标[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值