代码挑战:如果存在重复项,则重命名文件名

时间:2016-01-24 03:46:11

标签: javascript

我正在处理我在网上找到的编码挑战。我有第一个测试用例通过但第二个失败了。我试图确定我失败的第二个测试用例是否是拼写错误。

以下是问题:

  

按照他们的顺序给你一系列所需的文件名   创建。由于两个文件不能有相同的名称,所以它来了   稍后将以(k)的形式添加其名称,其中k为   最小的正整数,以便不使用获得的名称   爱好。

     

返回将提供给文件的名称数组。

测试案例:

1 - 通过:

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

2 - 失败:

  • INPUT:["a(1)","a(6)","a","a","a","a","a","a","a","a","a","a"]
  • 输出:["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;
}

问题:

  • 在第二个测试规范中,为什么不存在"a(1)(1)",就像有"doc(1)(1)"这是一个错字?
  • 如果有人提出改进我的方法或替代方法的建议,我将非常感谢您的反馈。

6 个答案:

答案 0 :(得分:3)

这是一种更简单的方法。我们的想法是将原始名称和生成的名称都存储在哈希表中:

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

答案 1 :(得分:1)

这是我的初学者方法:

const renameFiles = arr => {
  const fileObj = {};
  let count = 0;
  const renamed = arr.map(currentFile => {
    if (!Object.keys(fileObj).includes(currentFile)) {
      fileObj[currentFile] = count;
      return currentFile;
    } else {
      count++;
      if (Object.keys(fileObj).includes(`${currentFile}(${count})`)) {
        count++;
        return `${currentFile}(${count})`;
      } else return `${currentFile}(${count})`;
    }
  });
  return renamed;
};

答案 2 :(得分:1)

这是我的方法:

def fileNaming(names):
uniq = []
for i in range(len(names)):
    if names[i] not in uniq:
        uniq.append(names[i])
    else:
        k = 1
        while True:
            if (names[i] + "(" + str(k) + ")") in uniq:
                k += 1
            else:
                uniq.append(names[i] + "(" + str(k) + ")")
                break
return uniq

答案 3 :(得分:0)

使用arrray approch

//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);

答案 4 :(得分:0)

这是有效的c ++展示。

#include <map>
#include <string> 
using namespace std;

string makeName(string n, int i)
{
    string ret = n + "(";
    ret += std::to_string(i);
    ret += ")";
    return ret;
}
std::vector<std::string> fileNaming(std::vector<std::string> names)
{
    map<string, int> lookup;
    vector<string> outNames;
    for (auto name : names)
    {
        auto f = lookup.find(name);
        if (f != lookup.end())
        {
            int index = 1;

            while (lookup.find(makeName(name, index)) != lookup.end())
            {
                index++;
            }
            name = makeName(name, index); // reassign
        }
        lookup[name] = 1;
        outNames.push_back(name);
    }

    return outNames;
}

答案 5 :(得分:0)

这是我在 Javascript 中的方法:

VK_EXT_shader_stencil_export
相关问题