给定一个字符串,打乱顺序后添加一个字符,怎么得到新添的字符?

原本以为这题很简单,很快写出

function findStr (str1, str2) {
      str1 = str1.split('')
      str2 = str.split('')
  for (let i = 0; i < str2.length; i++) {
     if (str1.indexOf(str2[i]) === -1) {
          return str2[i]
     }
  } 
  return
}

很明显这是不对,因为这字符可能是来自原字符串

function findStr (str1, str2) {
      str1 = str1.split('')
      str2 = str.split('')
  for (let i = 0; i < str2.length; i++) {
     if (str1.indexOf(str2[i]) === -1) {
          return str2[i]
     } 
     // 查找重复的字符
     if  (str2.indexOf(str2[i]) !=== str2.lastIndexOf(str[i])){
          return str2[i]
     }
  } 
  return
}

这也明显不对。因为原字符串可能有重复字符串
下面先展示别人实现的代码

function findDiff (str1, str2) {
    let all = str1 + str2;
    let alllength = all.length;
    let hash = {};
    let i =0;
    // 将两个字符串合并,键为出现的字符,键值为字符出现的次数
    for (; i < alllength; i++) {
        hash[all[i]] ? hash[all[i]]++ : hash[all[i]] = 1;
    }
  //  因为只有新添的字符才会是奇数
    for (let e in hash) {
        if (hash[e] % 2 !== 0) {
            return e;
        }
    }
}

这启发了我,用对象的键唯一性来存储字符出现的次数,经过一番思考写完了代码

function objArr (str) {
    let res = {};
    for (let i = 0; i < str.length; i++) {
      res[str[i]] ? res[str[i]]++ : res[str[i]] = 1;
    }
    return res;
}

function findDiff1 (str1=randomAlp(), str2=fixStr(str1)) {
   let obj1 = objArr(str1);
   let obj2 = objArr(str2);
   let arr = Object.keys(obj2);
   let len = arr.length;
   for (let i = 0; i < len; i++) {
   // 对比对象若键不相同,就返回对应的键值
       if (!obj1[arr[i]]) {
           return arr[i];
       }
       // 若键值不相同,则返回对应的键值
       if (obj2[arr[i]] !== obj1[arr[i]]) {
           return arr[i];
       }
   }
}

上面的代码稍加改造,就可以变成判断字符串中出现最多的字符代码(半年前我的旧博客写过对应的代码)
这里再给出效率不是太好的代码(用了sort(),对于长字符串来说很耗时间)


function findDiff3 (str1, str2) {
    str1 = str1.split('').sort();
    str2 = str2.split('').sort();
    for (let i = 0, len = str2.length; i < len; i++) {
        if (str1[i] !== str2[i]) {
            return str2[i];
        }
    }
}

构建两个字符串的代码如下,打乱字符串的算法很不理想(应该使用洗牌算法的,可惜暂时没精力和时间去研究)https://75team.com/post/array-shuffle.html 这是一篇对这个随机算法深入了解的文章

function randomAlp (num = 10000) {
    let res = '';
    for (let i = 0; i < num; i++) {
        res += String.fromCharCode(Math.floor(Math.random()*26) + 97);
    }
    return res;
}

function randomSort () {
    return Math.random() > .5 ? -1 : 1;
}
  
function randomArray (arr) {
    let lv = Math.floor(arr.length / 2);
    for (let i = 0; i <= lv; i++) {
        arr.sort(randomSort);   
    }
    return arr;
}

function fixStr (str) {
    let arr = [];
    let res = '';
    str += String.fromCharCode(Math.floor(Math.random()*26) + 97);
    arr = str.split('');
    arr = randomArray(arr);
    for (let i = 0; i < arr.length; i++) {
        res += arr[i];
    }
    return res;
}

算法真的挺有趣

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值