原本以为这题很简单,很快写出
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;
}
算法真的挺有趣