统计字符出现的次数并去重

187 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前置条件:面试遇到的问题,考察JavaScript基础知识。要求用原生JavaScript实现,统计给定的字符中同一个字符出现的次数,以及对字符去重处理。

分析:思路大概是先通过处理字符串成数组,然后在数组里遍历字符串,通过比较每个字符是否重复判断是否重复,如果重复则去重,并且指针记录一次重复。

方法一

原理:利用双层循环将相邻元素 arr[i]和arr[i+1] 进行比较,相等则数组删除arr[i+1] 下标元素

方法二

原理:双层循环依次比对

方法三

原理:使用数组的indexOf()方法判断此元素在该数组中首次出现的位置下标与循环的下标是否相等

方法四

原理: 利用数组中的 array.filter(function(currentValue,index,arr)) 方法返回新的数组,不会影响原数组数据

方法五

原理:通过indexOf方判断当前元素在数组中的索引如果与循环的下标相等则push() 添加到新数组中

方法六

原理:利用空对象来记录新数组中已经存储过的元素

方法七

原理:借助新数组 判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中

方法八

原理:数组排序后(转换成字符串排序的),临近元素不相等则添加到新数组中

方法九

原理:数组排序后,临近元素比较后splice()方法删除重复项

以下粗略写了一个实现demo

<script>
		// 字符串
		var str = "a,a,a,a,b,c,c,c,d,a,c,e,f,d,b";
		// 使用 , 分割字符串
		var arr = str.split(",");
		// 存放不重复元素的数组,存放元素出现次数的数组
		var norepeat = [], num = []; 
		
		// 遍历 arr 数组中每个元素
		for (var i = 0, len = arr.length; i < len; i++) {
			// 暂存当前遍历到 arr 数组中的元素
			var tmp = arr[i];
			// 定义 boolean 标记,标记当前 arr 元素是否在 norepeat 数组中存在
			var exists = false; // 默认不存在
			// 将当前遍历到的 arr 数组中元素与 norepeat 数组中元素一一比较
			for (var j = 0, l = norepeat.length; j < l; j++) {
				if (tmp == norepeat[j]){ // 在 norepeat 数组中已经存在 arr 数组中当前遍历到的元素
										 // 说明 arr 数组中当前遍历到的元素重复出现,则应该将
										 // 其重复出现次数加1
					exists = true; // 标记元素已存在
					num[j]++; // 已存在,则出现次数加1
					break;
				}
			}
			
			if (!exists) { // 在 norepeat 数组中不存在当前 arr 数组的元素
				norepeat.push(tmp); // 将当前 arr 数组元素添加到 norepeat 数组中
				num.push(1); // 对应添加当前 arr 数组元素出现第1次的次数
			}
		}
		
		console.log("去重:" + norepeat);
		console.log("次数:" + num);
	</script>