JS:字符串,长度不为0,如何判断该字符串是否全为同一个字符,全部为同一个字符的示例:0,1,22,AAA。
回答
楼上的方法都比较麻烦,而且效率非常低,内容大同小异:遍历查找。
在下开拓一下思维,转换一个角度两行代码解决:正则表达式用的+原理。
let calcDistinctStr = (str) => {
let result = false;
result = (!!str && 1 < str.length && (s => {
let pattern = new RegExp(s.substr(0, 1) + "+", "ig");
return 0 < s.match(pattern).length && s.match(pattern)[0].length == s.length;
})(str));
return result;
};
console.log(calcDistinctStr("aaaaaa"));//ture
console.log(calcDistinctStr("1111"));//ture
console.log(calcDistinctStr("11112"));//false
console.log(calcDistinctStr("adfb"));//false
console.log(calcDistinctStr("aaabaaa"));//false
核心代码:
let pattern = new RegExp(s.substr(0, 1) + "+", "ig");
return 0 < s.match(pattern).length && s.match(pattern)[0].length == s.length;
1. 遍历字符串,逐个比较
for (let i=0;i < str.length;i++){
if (str[0] !== str[i]) {
return false
}
}
2. 使用正则
const reg = /^(.)\1*$/
return reg.test(str)
赞同方法1:innocent::scream: 方法2牛
方法 onlyOne 判断字符串是否由同一个字符组成。参数为字符串 s
function onlyOne(s){
if (s.length==1)
return true;
else {
s1.split('');
for (i=1;i<s1.length;i++)
if (s[0] != s[1])
return false;
return true;
}
}
直接用 set 去重,看是不是只剩一个就行
new Set(yourString).size === 1
这个写法可以,但是,效率低下。不如大师傅的那个高效。好想法。🤙🤙🤙
const is_repeat_str = (str) => {
return str === str.slice(0, 1).repeat(str.length);
};
console.log( is_repeat_str('aaaa') ); // true
console.log( is_repeat_str('abaa') ); // false
性能最高,最简单的方法,秒楼上全部
function match(str){
let length=str.length;
if(length%2>0){
str+=str[ 0 ];
length++;
}
return str.substring(0,length/2)==str.substring(length/2,length);
}
这个明显错的啊 abcabc 就和目标结果不同
function checkResult(str) {
if (typeof str !== 'string') {
throw '传入的参数不为字符串类型'
}
const strList = str.split('');
return strList.every(item => item === strList[0]);
}
var str = "aaab";
checkResult(str); // false;
var str2 = 'AAA';
checkResult(str2); // true;
vara str3 = 'ABBB';
checkResult(str3 ); //false
都是大佬,我也贴一个自己的菜鸟写法吧。
function onlyOne(str){
let strLength = str.length;
if(strLength === 1){
return true;
}
let tmpSet = new Set(str);
if(tmpSet.size === 1){
return true;
}else{
return false;
}
}
console.log(onlyOne('0')); //true
console.log(onlyOne('1')); //true
console.log(onlyOne('22')); //true
console.log(onlyOne('AAA')); //true
console.log(onlyOne('AB')); //false
切出来第一个然后字符串替换为”最后再判断长度这样是否可行?回复 @左岸恋雪Six : 看我的答案吧。大师傅差的不是一点半点。回复 @microkof : 我测试的是计算时间,大师傅的时间最短。回复 @左岸恋雪Six : 你这实验咋实验的?大师傅效率屎一样应该可以。但是要试一下性能如何。目前实验的情况,大师傅的那种效率最好。
console.time(1);
for (let index = 0; index < 10000; index++) {
let calcDistinctStr = (str) => {
// 大师傅方法 最差,差数十倍
let result = false;
result = ((s => {
let pattern = new RegExp(s.substr(0, 1) + "+", "ig");
return 0 < s.match(pattern).length && s.match(pattern)[0].length == s.length;
})(str));
return result;
// 方法2 比方法3略差
// var res = true;
// var start = str[0];
// for (let i = 0; i < str.length; i++) {
// if (start !== str[i]) {
// res = false
// }
// }
// return res;
// 方法3 最好
// return str === str.slice(0, 1).repeat(str.length);
};
calcDistinctStr('11111111')
}
console.timeEnd(1);
其他未列出的方法也都差不多,大师傅最差。
测试方法:注销其他方法,只留一个方法,不断刷新页面,看输出。
速度不是这么测的啊
这种测多次 得到单位时间运行次数的对
5,088,239 ops/sec ±0.58% (91 runs sampled)
还有就是 大样本和小样本 的结果也是不一样的