初稿日期:2019-07-01
作者:HConan
方法一
match正则部分注意:
-
\1
必须与小括号配合使用,所以有([a-zA-Z])
;正则表达式中的小括号 "()" 是代表分组的意思, 如果再其后面出现\1则是代表与第一个小括号中要匹配的内容相同 - 正则若使用
/([a-zA-Z]+)\1/g
与/([a-zA-Z])\1+/g
都是不对的,此方式不会匹配单个字符且有严重的个数错误
String.prototype.myMaxCharactor = function myMaxCharactor() {
// 1. 对字符串进行拆分排序重组
let ary = this.split('').sort().join('').match(/([a-zA-Z])\1*/g);
// 2. 判定是否为空串
if (ary === null) {
return console.log("请传入非空字符串");
}
// 3. 将字符串长度按照从大到小的顺序排列
let arySort = ary.sort((a, b) => b.length - a.length);
let aryMaxLength = [arySort[0]]; // 将数组中第一位(100%最大长度)放入新数组中
// 4. 判定第一位以后的排序中是否有与第一位长度相同的[最大长度字符出现多次]
for (let i = 1; i < arySort.length; i++) {
let maxLength = arySort[0].length;
if (arySort[i].length == maxLength) {
aryMaxLength.push(arySort[i]); // 如果有与最大长度相同的放入数组中
}
}
console.log("最大长度字符一共有 " + aryMaxLength.length + " 个");
for (let i = 0; i < aryMaxLength.length; i++) {
console.log(aryMaxLength[i][0], aryMaxLength[i].length);
}
}
let str = 'hconansuxunhehui';
str.myMaxCharactor(); // h 3 n 3 u 3
方法二
String.prototype.myMaxCharactor = function myMaxCharactor() {
let obj = {};
// 1. 遍历字符串,找到重复项的数量
for (let i = 0; i < this.length; i++) { // 遍历字符串
if (!obj[this.charAt(i)]) { // 若字符不存在于obj中,则存入并赋值为1
obj[this.charAt(i)] = 1;
} else {
obj[this.charAt(i)]++; // 若字符存在于obj中,则存入的值自加1
}
}
// 2. 遍历obj查找最大值
let maxLength = 0;
for (let i in obj) {
if (obj[i] > maxLength) {
maxLength = obj[i];
}
}
console.log("最大字符长度是 " + maxLength); // 最大字符长度是 3
// 3. 用最大值再次遍历整个obj,看是否有多个最大值项
let maxNum = 0;
for (let i in obj) {
if (obj[i] == maxLength) {
maxNum++;
console.log("最大字符第 " + maxNum + " 是 " + i);
// 最大字符第 1 是 h
// 最大字符第 2 是 n
// 最大字符第 3 是 u
}
}
console.log("最大字符共有 " + maxNum + " 个"); // 最大字符共有 3 个
}
let str = 'hconansuxunhehui';
str.myMaxCharactor();