2016-01-24 75 views
1

我正在通過我在網上找到的編碼挑戰。我有第一個測試用例通過,但第二個失敗。我試圖判斷我失敗的第二個測試用例是否是一個錯字。代碼挑戰:重命名文件名如果重複存在

這裏有一個問題:

現在給你想要的文件名的排列在其 創建的順序。由於兩個文件不能具有相同的名稱,因此後面的文件名將以(k)的形式添加到其名稱中,其中k是 最小的正整數,使得所獲得的名稱尚未被使用 。

返回將被賦予文件的名稱數組。

測試用例:

1 - 傳:

  • INPUT:["doc", "doc", "image", "doc(1)", "doc"]
  • OUTPUT:["doc", "doc(1)", "image", "doc(1)(1)", "doc(2)"]

2 - 失敗:

  • 輸入:["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]
  • OUTPUT:["a(1)","a(6)","a","a(2)","a(3)","a(4)","a(5)","a(7)","a(8)","a(9)","a(10)","a(11)"]

這裏是我的代碼,經過第一規格:

function fileNaming(names) { 
    var finalArr = [], 
     obj = {}; 
    names.forEach(function(val){ 

     if(obj[val] === undefined){ 
      if(finalArr.indexOf(val) === -1){ 
       finalArr.push(val); 
       obj[val] = 0; 
      } else { 
       obj[val] = 1; 
       finalArr.push(val + "(" + obj[val] + ")"); 
      } 

     } else { 
      finalArr.push(val + "(" + (++obj[val]) + ")"); 
     } 
    }); 
    return finalArr; 
} 

問:

  • 在第二次測試規範,爲什麼ISN有沒有"a(1)(1)"就像有一個"doc(1)(1)"這是一個錯字?
  • 如果有人提出了改進我的方法或其他方法的建議,我將非常感謝您的反饋。
+0

它不應該是「 」一(2)「 '而不是'「a(1)(1)」'? –

+0

我不確定,我認爲應該。但是如果你看第一個例子,有一個「doc」,「doc(1)」,「doc(1)(1)」,「doc(2)」'。 – HelloWorld

+0

期望的輸出看起來正確。不應該有一個(1)(1),因爲在輸入中遇到(1)之前,數組中不存在名爲a(1)的文件。該要求規定如果存在重複名稱,將使用下一個最小整數。由於下一個「a」迭代沒有(1),它將是(2)。 –

回答

3

這是一個更簡單的方法。這樣做是爲了保存原始和HashTable中生成的名稱:

f = function(xs) { 
 
    
 
    var c = {}, t = (x, n) => x + "(" + n + ")"; 
 
    
 
    return xs.map(function(x) { 
 
    var n = c[x] || 0; 
 
    
 
    c[x] = n + 1; 
 

 
    if(!n) 
 
     return x; 
 
    
 
    while(c[t(x, n)]) 
 
     n++; 
 
    
 
    c[t(x, n)] = 1; 
 
    return t(x, n); 
 
    }); 
 

 
}; 
 

 

 
q = ["doc", "doc", "image", "doc(1)", "doc", "doc"]; 
 
document.write('<pre>'+JSON.stringify(f(q))); 
 

 
q = ["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"] 
 
document.write('<pre>'+JSON.stringify(f(q)));

0

與arrray計算策略

//var arr=["doc", "doc", "image", "doc(1)", "doc"]; 
var arr=["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]; 

var arr1=new Array(); 
    for (var r in arr) 
    { 
     if(arr1.indexOf(arr[r])>-1) 
     {  
     var ind=1; 
     while(arr1.indexOf(arr[r]+'('+ind+')')>-1) 
     { 
     ind++;  
     } 
     var str=arr[r]+'('+ind+')'; 
     arr1.push(str); 
     } 
     else 
     { 
     arr1.push(arr[r]); 
     } 
    } 
    document.write("INPUT:"+arr+"</br>"); 
    document.write("OUTPUT:"+arr1);