Java中独特的Windows目录程序
在 Windows 文件系统中,两个文件夹/文件不能具有相同的名称。如果输入以前使用过的文件夹名称,系统会在其名称后加一个后缀,形式为 (k),其中,k 是最小的正整数,使得获得的名称保持唯一。
问题陈述
给定一个大小为 n 的字符串数组 d irNames 。您将在 Windows 文件系统中创建 n 个文件夹,以便在第 i 分钟创建一个名为 dirNames[i] 的文件夹。任务是返回一个长度为 n 的字符串数组,其中 ans[i] 是系统在创建第 i 个文件夹时为其分配的实际名称。
例子:
Input: dirNames = ["abc","pqrs","mnp","abc(2019)"]
Output: ["abc","pqrs","mnp","abc(2019)"]
说明:让我们看看文件系统如何创建文件夹名称:
“abc” –> 之前没有分配,仍然是“abc”
“pqrs” -> 之前没有分配,仍然是“pqrs”
“mnp” -> 之前没有分配,仍然是“mnp”
“abc(2019)” –> 之前未分配,仍然是“abc(2019)”
Input: dirNames = ["cod","cod(1)","cod","test"]
Output: ["cod","cod(1)","cod(2)","test"]
说明:让我们看看文件系统如何创建文件夹名称:
“cod” –> 之前未分配,仍然是“cod”
“cod(1)” –> 之前未分配,仍然是“cod(1)”
“cod” –> 保留名称,系统添加(k),因为“cod(1)”也保留,系统将k = 2。它变成“cod(2)”
“test” -> 之前没有分配,仍然是“test”
解决方案
我们将维护一个映射来存储特定名称是否已经出现了多少次。然后反复检查名称是否已经出现并且它是否包含括号中的数字。然后增加数字直到不存在。同时,也要更新地图。
Java
import java.io.*;
import java.util.*;
public class GFG {
// Main Method
public static void main(String[] args)
throws IOException
{
String[] dirNames
= { "cod", "cod(1)", "cod", "test" };
String[] output = getFolderNames(dirNames);
for (String i : output) {
System.out.print(i + " ");
}
}
public static String[] getFolderNames(String[] names)
{
Map m = new HashMap<>();
for (int i = 0; i < names.length;
m.put(names[i], 1), i++)
if (m.containsKey(names[i])) {
int k = m.get(names[i]);
while (
m.containsKey(names[i] + "(" + k + ")"))
k++;
m.put(names[i], k + 1);
names[i] = names[i] + "(" + k + ")";
}
return names;
}
}
输出:
cod cod(1) cod(2) test
- 时间复杂度:O(n)
- 空间复杂度:O(n 2 )