louzhedong/blog

不重复的工牌

louzhedong opened this issue · 0 comments

习题

出处:阿里笔试题

现在有数组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;
}