JavaScript获取一个字符串中字符出现最多的次数和对应的字符

作者:HConan
日期:2019年7月1日

方法一

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值