Javascript 算法篇(一)

写一个函数,统计字符串中出现最多的字符
解释 :给出一段英文连续的英文数字字符串"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 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值