写一个函数,统计字符串中出现最多的字符
解释 :给出一段英文连续的英文数字字符串"sadasdasdsdfqrwqvxcvzsdfatqt234213412sdfasreqwersfaze123sfdasdfrt56123231441231rqeqw;;,safasew;r;wqer;rqwe;rq;we",找出重复出现次数最多的字母或数字
var maxChar = function (str) {
// 检验是否为字符串类型 不是的话直接返回
if (Object.prototype.toString.call(str) !== '[object String]') {
return
}
// 只有一个字符的话 直接返回这个字符 就是出现最多的
if (str.length === 1) {
return str
}
// 遍历所有字符串 生成一个每个字符串出现次数的集合
var charMap = {}
for (let i = 0; i <= str.length; i++) {
if (charMap.hasOwnProperty(str[i])) {
charMap[str[i]]++
} else {
charMap[str[i]] = 1
}
}
// 遍历集合 来获取出现的最大次数的字符
var max = 0 // 最大出现次数
var maxChar = '' // 出现的最大次数的字符
// for in 遍历 charMap
for(char in charMap) {
// 当有次数比之前的次数大的时候 重新复制
if (charMap[char] > max) {
max = charMap[char]
maxChar = char
}
}
// 必要的话 也可以把 max 也返回出去 max:出现的次数
return maxChar
}
var str="sadasdasdsdfqrwqvxcvzsdfatqt234213412sdfasreqwersfaze123sfdasdfrt56123231441231rqeqw;;,safasew;r;wqer;rqwe;rq;we"
console.log(maxChar(str)) // s
数组去重
解释 :给定一个数组[‘sss’, 1, 3, ‘2’, ‘3’, ‘sss’, 4, 2, 1, ‘f’, 5, 2, 10, ‘10’, ‘ffff’, ‘w’, ‘;’, ‘!!!’, ‘123’, 123, ‘fqrt’, ‘afvz’, 22, 123],把数组中重复的元素去掉
var arr = ['sss', 1, 3, '2', '3', 'sss', 4, 2, 1, 'f', 5, 2, 10, '10', 'ffff', 'w', ';', '!!!', '123', 123, 'fqrt', 'afvz', 22, 123]
var arrDuplicates = function (arr) {
// 类型校验
if (Object.prototype.toString.call(arr) !== '[object Array]') {
return
}
// 空数组或者只有一个元素 无需去重 直接返回
if (arr.length <= 1) {
return arr
}
var newArr = [] // 新数组备用
var strObj = {} // 字符串对象
var numObj = {} // 数字对象
// 这里区分出了数字和字符串的去重
for(var i = 0; i < arr.length; i++) {
if (typeof arr[i] === 'string') {
if (!strObj.hasOwnProperty(arr[i])) {
strObj[arr[i]] = true
newArr.push(arr[i])
}
}
if (typeof arr[i] === 'number') {
if (!numObj.hasOwnProperty(arr[i])) {
numObj[arr[i]] = true
newArr.push(arr[i])
}
}
}
return newArr
}
console.log(arrDuplicates(arr)) // 输出
[‘sss’,1,3,‘2’,‘3’,4,2,‘f’,5,10,‘10’,‘ffff’,‘w’,’;’,’!!!’,‘123’,123,‘fqrt’,‘afvz’,22]
数组排序
解释:将数组中的数字进行从小到大排序,这里使用的是 快速排序 方式 (冒泡排序在基础篇有介绍)
快速排序
给定一个数组[2,5,1,4,2,4,5,6,‘2a’,null,‘abc’,7,8,2,‘100’,’^##¥1’,3,1,4,5,6,1,100,4,44,22,55,24,{a:1}]进行排序
var arr = [2, 5, 1, 4, 2, 4, 5, 6, null, '2a', '222b', 7, 8, 2, '100', '^##¥1', 3, 1, 4, 5, 6, 1, 100, 4, 44, 22, 55, 24, {
a: 1
}]
var arrSort = function (arr) {
// 类型校验
if (Object.prototype.toString.call(arr) !== '[object Array]') {
return
}
// 空数组或者只有一个元素 无需去重 直接返回
if (arr.length <= 1) {
return arr
}
// 进行过滤 过滤掉无效项
for (var i = 0; i < arr.length; i++) {
if (!(parseInt(arr[i]) > 0) || isNaN(arr[i])) {
arr.splice(i, 1)
i--
}
}
// 快速排序
let quickSort = function (arr) {
// 校验数组长度 不超过1的话直接返回
if (arr.length <= 1) {
return arr;
}
// 待比较的值
var standard = parseInt(arr[0])
var leftArr = []
var rightArr = []
for (var j = 1; j < arr.length; j++) {
// 遍历数组 大于基准值的放入右边的数组 不大于的就放入左边的数组
if (parseInt(arr[j]) > standard) {
rightArr.push(arr[j])
} else {
leftArr.push(arr[j])
}
}
// 进行递归操作,然后合并数组并返回
return [].concat(quickSort(leftArr), [standard], quickSort(rightArr))
}
return quickSort(arr)
}
console.log(arrSort(arr))
// [ 1, 1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 22, 24, 44, 55, 100, 100 ]