前言
- 其实只是一个小demo
- js基础
- 使用单元测试测试通过率
- 源码链接
试题
去除字符串中出现次数最少的字符,不改变原字符串的顺序
“ababac” ——> “ababa”
“aaabbbcceeff” ——> “aaabbb”
思考
- 其实看到这个问题的时候更多的是思考
- 找规律(如果所有字符串出现次数相同那么就应该保留)
- 下面是我的思路(欢迎留言分享更好的实现)
- 算是抛砖引玉了
第一步
首先找出每个字符串出现的次数
// 计算每个字符出现的次数
const combineKeyLength = str.split('').reduce((target, nextKey) => {
if (nextKey in target) {
target[nextKey]++;
} else {
target[nextKey] = 1;
}
return target;
}, {});
第二步
开始判断该字符串是不是每个字符都是相同次数
const lengthArr = Object.values(combineKeyLength);
// 3. 如果每个都只出现相同次数保留原字符串
if (new Set(lengthArr).size === 1) {
return str;
}
第三步
正常情况下实现删除最小出现次数
//存储正则集合
const regs = []; //存储匹配到的正则表达式 like [/a/g, /c/g, ...]
const selectMinLengthStrValue = Math.min(...lengthArr);
for (strKey in combineKeyLength) {
if (combineKeyLength[strKey] == selectMinLengthStrValue) {
regs.push(new RegExp(`${strKey}`, 'g'));
}
}
return regs.reduce((s, reg) => {
str = str.replace(reg, '');
return str;
}, str);
};
测试
分析
其实更建议每次我们写出一个方法或者其他公共组件时候,需要写一个测试用例,来分析各种可能,那么这次算是一个黑盒形式、代码 -> 测试 另一类开发形如 测试 -> 代码
npm i jest -D
jest --init
package.json增加scripts脚本
"test": "jest"
写脚本
//新建test.spec.js
const { removeMiniumStr } = require('./util');
const str1 = 'ababac';
const str2 = 'aaabbbcceeff';
const str3 = 'abcdefg';
const str4 = 'aabbccddee';
const str5 = 'aabbcccddee';
describe('test-remove-minimum-str', () => {
test('str1', () => {
expect(removeMiniumStr(str1)).toBe('ababa');
});
test('str2', () => {
expect(removeMiniumStr(str2)).toBe('aaabbb');
});
test('str3', () => {
expect(removeMiniumStr(str3)).toBe('abcdefg');
});
test('str4', () => {
expect(removeMiniumStr(str4)).toBe('aabbccddee');
});
test('str5', () => {
expect(removeMiniumStr(str5)).toBe('ccc');
});
});
执行结果
npm run test
总结
这是一个基础的小demo,可能会在面试的时候经常遇到,本文更加强调的是当我们编写一个功用方法的时候,应该试着去写一些脚本,当然这种很mini的工具函数,完全可以不用浪费时间,即便这样这是一个思路