根据一些输入值生成用户标识

时间:2018-08-02 15:59:23

标签: javascript

我在Mettl遇到了这个问题:

该函数具有四个参数-

  1. 名字(字符串)
  2. 姓氏(字符串)
  3. pin(int):一个包含任意长度数字的数字

    例如:1234,34565789

  4. number(int):一个数字(1-9,包括端值,并且小于引脚的长度),从头到尾确定生成ID所必须使用的位数。上面输入的图钉的末端。

生成ID的条件是:

  1. 将长度较小的名称作为小名称,将长度较大的名称作为大名称。
  2. 如果名字和姓氏的长度相等,则将按字母顺序出现的名字作为小名字。

  3. 使用“数字”和“引脚”输入获得用于生成的数字。

  4. 生成ID后,字母会切换,即将小写字母更改为大写字母,反之亦然。

示例1:

名字:拉吉夫

姓:Roy

图钉:123456

编号:3

“罗伊”的长度小于“拉吉夫”的长度。因此,“罗伊”变成了小名字,“拉吉夫”变成了大名字。从引脚开始的第三个数字为“ 3”,从引脚结束的第三个数字为“ 4”。因此,生成的数字为34。

小写字母的最后一个字母为'y'。因此,生成的ID为yRajiv34。

切换字母后,生成的最终ID为YrAJIV34。

function generateId(firstName, lastName, pin, n) {
    var result = '';
    var smallName = '';
    var largeName = '';
    if (firstName.length != lastName.length) {
        if (firstName.length < lastName.length) {
            smallName = firstName;
            largeName = lastName;
        } else {
            largeName = firstName;
            smallName = lastName;
        }

    } else {
        var names = [firstName.toLowerCase(), lastName.toLowerCase()];
        var sorted = names.sort(function (a, b) {
            return a > b;
        });
        smallName = sorted[0];
        largeName = sorted[1];
    }

    result += smallName.substr(smallName.length - 1, 1).toUpperCase();
    result += largeName.substr(0, 1).toLowerCase() + largeName.substr(1, largeName.length).toUpperCase();

    var pinString = pin.toString();
    var numberLength = pinString.length;

    result += pinString.charAt(n - 1) + pinString.charAt(numberLength - n);

    return result;
}

var x = generateId('Kumar', 'Kumud', 530076, 2);
console.log(x);

var y = generateId('Rajiv', 'Roy', 345678, 3);
console.log(y);

问题:

对于我通过的所有测试用例,它都能正常工作,甚至在mettl站点中正确的测试用例为7/10。我不知道其余3个测试用例失败的原因是什么。有什么方法可以改善算法或我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您不是在切换字符,只是假设字符串的第一个字符为大写字母,然后使其变为小写,而所有其他字符都为小写字母,并使它们变为大写。 这不适用于以下情况:

generateId('RajIV', 'Roy', 345678, 6); // YrAJIV83

您还无法处理number大于pin长度的情况。它仍然给出输出。

generateId('RajIV', 'Roy', 345678, 7); // YrAJIV