Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

['ab', 'c', 'ab', 'd', 'c'] => ['ab1', 'c1' ,'ab2', 'd', 'c2']

Sunny-117 opened this issue · comments

['ab', 'c', 'ab', 'd', 'c'] => ['ab1', 'c1' ,'ab2', 'd', 'c2']
commented

算法题:字符串重命名。
举例 ,输入["ab","c","ab","c","a","d"],
输出["ab1","c1","ab2","c2","a","d"],
输出不可以改变原有顺序,不重复的字符串不动。

const arr = ['ab', 'c', 'ab', 'd', 'c']
function getArr(arr){
  for(let i=0; i<arr.length; i++){
    let index = 1;
    let str = arr[i];
    for(let j=i+1; j<arr.length; j++){
      if(arr[j] === str){
        if(index == 1){
          arr[i] = str+1;
        }
        index++;
        arr[j] = str+index; 
      }
    }
  }
  return arr;
}
console.log(getArr(arr))//[ 'ab1', 'c1', 'ab2', 'd', 'c2' ]
// 算法题:字符串重命名。
// 举例 ,输入["ab","c","ab","c","a","d"],
// 输出["ab1","c1","ab2","c2","a","d"],
// 输出不可以改变原有顺序,不重复的字符串不动。

// 最简单的做法:直接暴力,双循环即可实现
// 也可以采用map存储计数,然后从尾部开始遍历,注意两种计数为1的情况需要区分即可

function rename(arr) {
  let map = new Map();
  for (let i = 0; i < arr.length; i++) {
    let char = arr[i];
    if (map.has(char)) map.set(char, map.get(char) + 1);
    else map.set(char, 1);
  }
  console.log(map);
  for (let i = arr.length - 1; i >= 0; i--) {
    let char = arr[i];
    let count = map.get(char);
    if (count === 1) continue;
    if (count === "mark") arr[i] += 1;
    else {
      arr[i] += count--;
      map.set(char, count === 1 ? "mark" : count);
    }
  }
  return arr;
}

console.log(rename(["ab", "ab", "c", "ab", "c", "a", "d"]));
function main(arr){
    const res = [];
    const map = new Map();
    for (const item of arr) {
        map.has(item) ? (map.set(item, map.get(item) + 1), res.push(item + map.get(item))) : (map.set(item, 1), res.push(item + 1));
    }
    return res;
}
commented
const arr = ['ab', 'c', 'ab', 'd', 'c'];
let map = new Map();
for (let i = 0; i < arr.length; i++) {
  map.set(arr[i], (map.get(arr[i]) || 0) + 1);
}
map = Array.from(map).filter((item) => item[1] !== 1);
map = new Map(map);
for (let i = arr.length - 1; i >= 0; i--) {
  if (map.get(arr[i]) > 0) {
    let tmp = arr[i];
    let val = map.get(arr[i]);
    arr[i] += map.get(arr[i]);
    map.set(tmp, val - 1);
  }
}
console.log(arr);

少一个for循环,空间换时间

function renameDuplicates(arr) {
  let countMap = {};
  arr.forEach((el, idx, origin) => {
    if(!countMap[el]) {
        countMap[el] = {}
        countMap[el].num = 1
        countMap[el].startIndex = idx
    } else {
        countMap[el].num += 1
    }
    if(countMap[el].num === 1) return
    else {
        if(countMap[el].num === 2) origin[countMap[el].startIndex] += '1'
        origin[idx] =  el + countMap[el].num
    }
  });
  return arr
}
renameDuplicates(['a', 'c', 'c', 'c']) // ['a', 'c1', 'c2', 'c3']
const arr = ['ab', 'c', 'ab', 'd', 'c']

let map = {}
let list = arr.reduce((pre, item, index, arr) => {
  if(map[item]){
    map[item].num++
  }else{
    map[item] = {
      index:index,
      num:1
    }
  }
  if(map[item].num === 1){
    pre.push(item)
  }else{
    pre[map[item].index]+=1
    pre.push(item + map[item].num) 
  }
  return pre
}, [])


console.log(list)
function rename(arr) {
  const map = {} //空间换时间
  let res = [] //记录结果
  for (let i = 0; i < arr.length; i++) {
    let s = arr[i]
    if (map[s]) {
      if (map[s].num === 1) { //出现重复,修改第一个元素为元素1
        res[map[s].index] += 1
      }
      map[s].num++
      res.push(s + map[s].num)
    } else {
      map[s] = { //记录第一次遍历时的下标
        num: 1,
        index: i
      }
      res.push(s) //先默认没有重复,如果有,后续根据下标进行修改
    }
  }
  return res
}