不重复的工牌
louzhedong opened this issue · 0 comments
louzhedong commented
习题
出处:阿里笔试题
现在有数组A和数组B,数组A表示男生数组,每个男生元素都有姓名和工号,数组B表示女生数组,每个女生元素有姓名和工号,现在要求把两个数组合成一个按工号排序的升序数组,如果男生女生工号一样,则把女生工号加1,要求最后所得的数组不能有重复的工号
思路
设置双指针,遍历两个数组,将每一个项加入到新的数组中。设置一个count来记录重复的次数,使得后面的工牌号都向后偏移count个位置,防止重复
解答
/**
*
* @param {*} man {name: '', no: ''}
* @param {*} woman {name: '', no: ''}
* @return []
*/
function uniqueArray(man, woman) {
var man_length = man.length,
woman_length = woman.length;
if (man_length === 0) {
return woman;
}
if (woman_length === 0) {
return man;
}
var i = 0,
j = 0,
count = 0, // 记录新数组的工号相比于原数组增加的数量
result = [];
man.sort(function (prev, next) { // 将原数组按升序排序
return prev.no - next.no;
})
woman.sort(function (prev, next) { // 将原数组按升序排序
return prev.no - next.no;
})
while (i < man_length && j < woman_length) {
if (man[i].no === woman[j].no) {
man[i].no += count;
woman[j].no += (1 + count);
result.push(man[i]);
result.push(woman[j]);
count++;
i++;
j++;
} else if (man[i].no < woman[j].no) {
man[i].no += count;
result.push(man[i]);
i++;
} else {
woman[j].no += count;
result.push(woman[i]);
j++;
}
}
while (i < man_length) {
man[i].no += count;
result.push(man[i]);
i++;
}
while (j < woman_length) {
woman[j].no += count;
result.push(woman[j]);
j++;
}
return result;
}