# 简化路径

<p>给你一个字符串 <code>path</code> ，表示指向某一文件或目录的 Unix 风格 <strong>绝对路径 </strong>（以 <code>'/'</code> 开头），请你将其转化为更加简洁的规范路径。</p><p class="MachineTrans-lang-zh-CN">在 Unix 风格的文件系统中，一个点（<code>.</code>）表示当前目录本身；此外，两个点 （<code>..</code>） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，<code>'//'</code>）都被视为单个斜杠 <code>'/'</code> 。 对于此问题，任何其他格式的点（例如，<code>'...'</code>）均被视为文件/目录名称。</p><p>请注意，返回的 <strong>规范路径</strong> 必须遵循下述格式：</p><ul>	<li>始终以斜杠 <code>'/'</code> 开头。</li>	<li>两个目录名之间必须只有一个斜杠 <code>'/'</code> 。</li>	<li>最后一个目录名（如果存在）<strong>不能 </strong>以 <code>'/'</code> 结尾。</li>	<li>此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 <code>'.'</code> 或 <code>'..'</code>）。</li></ul><p>返回简化后得到的 <strong>规范路径</strong> 。</p><p> </p><p><strong>示例 1：</strong></p><pre><strong>输入：</strong>path = "/home/"<strong><br />输出：</strong>"/home"<strong><br />解释：</strong>注意，最后一个目录名后面没有斜杠。 </pre><p><strong>示例 2：</strong></p><pre><strong>输入：</strong>path = "/../"<strong><br />输出：</strong>"/"<strong><br />解释：</strong>从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。</pre><p><strong>示例 3：</strong></p><pre><strong>输入：</strong>path = "/home//foo/"<strong><br />输出：</strong>"/home/foo"<strong><br />解释：</strong>在规范路径中，多个连续斜杠需要用一个斜杠替换。</pre><p><strong>示例 4：</strong></p><pre><strong>输入：</strong>path = "/a/./b/../../c/"<strong><br />输出：</strong>"/c"</pre><p> </p><p><strong>提示：</strong></p><ul>	<li><code>1 <= path.length <= 3000</code></li>	<li><code>path</code> 由英文字母，数字，<code>'.'</code>，<code>'/'</code> 或 <code>'_'</code> 组成。</li>	<li><code>path</code> 是一个有效的 Unix 风格绝对路径。</li></ul>

以下程序实现了这一功能，请你填补空白处内容：

```cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *simplifyPath(char *path)
{
	int len = strlen(path);
	if (len == 0)
	{
		return path;
	}
	char *p = path;
	int *indexes = malloc(len * sizeof(int));
	int depth = 0;
	int name_start = 1;
	while (*p != '\0')
	{
		if (*p == '/')
		{
			if (p > path && *(p - 1) != '/' && *(p - 1) != '.')
			{
				name_start = 1;
			}
		}
		else if (*p == '.')
		{
			if (*(p + 1) == '\0' || *(p + 1) == '/')
			{
				p += 1;
			}
			else if (*(p + 1) == '.' && (*(p + 2) == '\0' || *(p + 2) == '/'))
			{
				if (depth > 0)
				{
					depth--;
					name_start = 1;
				}
				p += 2;
			}
			else
			{
				indexes[depth++] = p - path;
				while (*p != '/' && *p != '\0')
				{
					p++;
				}
			}
			if (*p == '\0')
			{
				break;
			}
		}
		else
		{
			if (name_start && depth >= 0)
			{
				indexes[depth++] = p - path;
				name_start = 0;
			}
		}
		p++;
	}
	int i;
	char *result = malloc(len + 1);
	char *q = result;
	if (depth <= 0)
	{
		*q++ = '/';
	}
	else
	{
		for (i = 0; i < depth; i++)
		{
			____________________;
		}
	}
	*q = '\0';
	return result;
}
int main(int argc, char **argv)
{
	if (argc != 2)
	{
		fprintf(stderr, "Usage: ./test path\n");
		exit(-1);
	}
	printf("%s\n", simplifyPath(argv[1]));
	return 0;
}
```

## template

```cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *simplifyPath(char *path)
{
	int len = strlen(path);
	if (len == 0)
	{
		return path;
	}
	char *p = path;
	int *indexes = malloc(len * sizeof(int));
	int depth = 0;
	int name_start = 1;
	while (*p != '\0')
	{
		if (*p == '/')
		{
			if (p > path && *(p - 1) != '/' && *(p - 1) != '.')
			{
				name_start = 1;
			}
		}
		else if (*p == '.')
		{
			if (*(p + 1) == '\0' || *(p + 1) == '/')
			{
				p += 1;
			}
			else if (*(p + 1) == '.' && (*(p + 2) == '\0' || *(p + 2) == '/'))
			{
				if (depth > 0)
				{
					depth--;
					name_start = 1;
				}
				p += 2;
			}
			else
			{
				indexes[depth++] = p - path;
				while (*p != '/' && *p != '\0')
				{
					p++;
				}
			}
			if (*p == '\0')
			{
				break;
			}
		}
		else
		{
			if (name_start && depth >= 0)
			{
				indexes[depth++] = p - path;
				name_start = 0;
			}
		}
		p++;
	}
	int i;
	char *result = malloc(len + 1);
	char *q = result;
	if (depth <= 0)
	{
		*q++ = '/';
	}
	else
	{
		for (i = 0; i < depth; i++)
		{
			p = path + indexes[i];
			*q++ = '/';
			while (*p != '/')
			{
				*q++ = *p++;
			}
		}
	}
	*q = '\0';
	return result;
}
int main(int argc, char **argv)
{
	if (argc != 2)
	{
		fprintf(stderr, "Usage: ./test path\n");
		exit(-1);
	}
	printf("%s\n", simplifyPath(argv[1]));
	return 0;
}
```

## 答案

```cpp
p = path + indexes[i];
*q++ = '/';
while (*p != '/')
{
	*q++ = *p++;
}
```

## 选项

### A

```cpp
p = path + indexes[i++];
*q++ = '/';
while (*p == '/')
{
	*q++ = *p++;
}
```

### B

```cpp
p = path + indexes[i++];
*q++ = '/';
while (*p != '/')
{
	*q++ = *p++;
}
```

### C

```cpp
p = path + indexes[i];
*q++ = '/';
while (*p == '/')
{
	*q++ = *p++;
}
```