Skip to content

Commit c5ff754

Browse files
committed
feat: add solutions to lc problem: No.1487
No.1487.Making File Names Unique
1 parent c1002e3 commit c5ff754

File tree

6 files changed

+229
-2
lines changed

6 files changed

+229
-2
lines changed

solution/1400-1499/1487.Making File Names Unique/README.md

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,111 @@
7070

7171
<!-- 这里可写通用的实现逻辑 -->
7272

73+
**方法一:哈希表**
74+
75+
我们可以用哈希表 $d$ 记录每个文件夹的最小可用编号,其中 $d[name] = k$ 表示文件夹 $name$ 的最小可用编号为 $k$。初始时,$d$ 中没有任何文件夹,因此 $d$ 为空。
76+
77+
接下来遍历文件夹数组,对于每个文件名 $name$:
78+
79+
- 如果 $name$ 在 $d$ 中,说明文件夹 $name$ 已经存在,我们需要找到一个新的文件夹名字。我们可以不断地尝试 $name(k)$,其中 $k$ 从 $d[name]$ 开始,直到找到一个文件夹名字 $name(k)$ 不存在于 $d$ 中为止。我们将 $name(k)$ 加入 $d$ 中,并将 $d[name]$ 更新为 $k + 1$。然后我们将 $name$ 更新为 $name(k)$。
80+
- 如果 $name$ 不在 $d$ 中,我们可以直接将 $name$ 加入 $d$ 中,并将 $d[name]$ 更新为 $1$。
81+
- 接着我们将 $name$ 加入答案数组。然后继续遍历下一个文件名。
82+
83+
遍历完所有文件名后,我们即可得到答案数组。
84+
85+
> 在以下代码实现中,我们直接修改文件名数组 $names$,而不使用额外的答案数组。
86+
87+
时间复杂度 $O(L)$,空间复杂度 $O(L)$,其中 $L$ 为数组 $names$ 中所有文件名的长度之和。
88+
7389
<!-- tabs:start -->
7490

7591
### **Python3**
7692

7793
<!-- 这里可写当前语言的特殊实现逻辑 -->
7894

7995
```python
80-
96+
class Solution:
97+
def getFolderNames(self, names: List[str]) -> List[str]:
98+
d = defaultdict(int)
99+
for i, name in enumerate(names):
100+
if name in d:
101+
k = d[name]
102+
while f'{name}({k})' in d:
103+
k += 1
104+
d[name] = k + 1
105+
names[i] = f'{name}({k})'
106+
d[names[i]] = 1
107+
return names
81108
```
82109

83110
### **Java**
84111

85112
<!-- 这里可写当前语言的特殊实现逻辑 -->
86113

87114
```java
115+
class Solution {
116+
public String[] getFolderNames(String[] names) {
117+
Map<String, Integer> d = new HashMap<>();
118+
for (int i = 0; i < names.length; ++i) {
119+
if (d.containsKey(names[i])) {
120+
int k = d.get(names[i]);
121+
while (d.containsKey(names[i] + "(" + k + ")")) {
122+
++k;
123+
}
124+
d.put(names[i], k);
125+
names[i] += "(" + k + ")";
126+
}
127+
d.put(names[i], 1);
128+
}
129+
return names;
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
vector<string> getFolderNames(vector<string>& names) {
140+
unordered_map<string, int> d;
141+
for (auto& name : names) {
142+
int k = d[name];
143+
if (k) {
144+
while (d[name + "(" + to_string(k) + ")"]) {
145+
k++;
146+
}
147+
d[name] = k;
148+
name += "(" + to_string(k) + ")";
149+
}
150+
d[name] = 1;
151+
}
152+
return names;
153+
}
154+
};
155+
```
88156
157+
### **Go**
158+
159+
```go
160+
func getFolderNames(names []string) []string {
161+
d := map[string]int{}
162+
for i, name := range names {
163+
if k, ok := d[name]; ok {
164+
for {
165+
newName := fmt.Sprintf("%s(%d)", name, k)
166+
if d[newName] == 0 {
167+
d[name] = k + 1
168+
names[i] = newName
169+
break
170+
}
171+
k++
172+
}
173+
}
174+
d[names[i]] = 1
175+
}
176+
return names
177+
}
89178
```
90179

91180
### **...**

solution/1400-1499/1487.Making File Names Unique/README_EN.md

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,86 @@
5959
### **Python3**
6060

6161
```python
62-
62+
class Solution:
63+
def getFolderNames(self, names: List[str]) -> List[str]:
64+
d = defaultdict(int)
65+
for i, name in enumerate(names):
66+
if name in d:
67+
k = d[name]
68+
while f'{name}({k})' in d:
69+
k += 1
70+
d[name] = k + 1
71+
names[i] = f'{name}({k})'
72+
d[names[i]] = 1
73+
return names
6374
```
6475

6576
### **Java**
6677

6778
```java
79+
class Solution {
80+
public String[] getFolderNames(String[] names) {
81+
Map<String, Integer> d = new HashMap<>();
82+
for (int i = 0; i < names.length; ++i) {
83+
if (d.containsKey(names[i])) {
84+
int k = d.get(names[i]);
85+
while (d.containsKey(names[i] + "(" + k + ")")) {
86+
++k;
87+
}
88+
d.put(names[i], k);
89+
names[i] += "(" + k + ")";
90+
}
91+
d.put(names[i], 1);
92+
}
93+
return names;
94+
}
95+
}
96+
```
97+
98+
### **C++**
99+
100+
```cpp
101+
class Solution {
102+
public:
103+
vector<string> getFolderNames(vector<string>& names) {
104+
unordered_map<string, int> d;
105+
for (auto& name : names) {
106+
int k = d[name];
107+
if (k) {
108+
while (d[name + "(" + to_string(k) + ")"]) {
109+
k++;
110+
}
111+
d[name] = k;
112+
name += "(" + to_string(k) + ")";
113+
}
114+
d[name] = 1;
115+
}
116+
return names;
117+
}
118+
};
119+
```
68120
121+
### **Go**
122+
123+
```go
124+
func getFolderNames(names []string) []string {
125+
d := map[string]int{}
126+
for i, name := range names {
127+
if k, ok := d[name]; ok {
128+
for {
129+
newName := fmt.Sprintf("%s(%d)", name, k)
130+
if d[newName] == 0 {
131+
d[name] = k + 1
132+
names[i] = newName
133+
break
134+
}
135+
k++
136+
}
137+
}
138+
d[names[i]] = 1
139+
}
140+
return names
141+
}
69142
```
70143

71144
### **...**
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
vector<string> getFolderNames(vector<string>& names) {
4+
unordered_map<string, int> d;
5+
for (auto& name : names) {
6+
int k = d[name];
7+
if (k) {
8+
while (d[name + "(" + to_string(k) + ")"]) {
9+
k++;
10+
}
11+
d[name] = k;
12+
name += "(" + to_string(k) + ")";
13+
}
14+
d[name] = 1;
15+
}
16+
return names;
17+
}
18+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func getFolderNames(names []string) []string {
2+
d := map[string]int{}
3+
for i, name := range names {
4+
if k, ok := d[name]; ok {
5+
for {
6+
newName := fmt.Sprintf("%s(%d)", name, k)
7+
if d[newName] == 0 {
8+
d[name] = k + 1
9+
names[i] = newName
10+
break
11+
}
12+
k++
13+
}
14+
}
15+
d[names[i]] = 1
16+
}
17+
return names
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public String[] getFolderNames(String[] names) {
3+
Map<String, Integer> d = new HashMap<>();
4+
for (int i = 0; i < names.length; ++i) {
5+
if (d.containsKey(names[i])) {
6+
int k = d.get(names[i]);
7+
while (d.containsKey(names[i] + "(" + k + ")")) {
8+
++k;
9+
}
10+
d.put(names[i], k);
11+
names[i] += "(" + k + ")";
12+
}
13+
d.put(names[i], 1);
14+
}
15+
return names;
16+
}
17+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def getFolderNames(self, names: List[str]) -> List[str]:
3+
d = defaultdict(int)
4+
for i, name in enumerate(names):
5+
if name in d:
6+
k = d[name]
7+
while f'{name}({k})' in d:
8+
k += 1
9+
d[name] = k + 1
10+
names[i] = f'{name}({k})'
11+
d[names[i]] = 1
12+
return names

0 commit comments

Comments
 (0)