JavaScript实现算法(利用对象求解问题归类)

统计字符串中连续字母数量最多的

// \num,匹配num,其中num是一个正整数。对所获取的匹配的引用,“(.)\1”匹配两个连续的相同字符
// console.log('aaasdofjaopfjopaiiisjssfopiasdfffff'.match(/(.)\1+/g))
var str = 'aaasdofjaopfjopaiiisjssfopiasdfffff'
var result = str.match(/(.)\1+/g)
var arr = []
for (var i = 0; i < result.length; i++) {
  arr.push(result[i].length)
}
arr.sort((a, b) => {
  return a-b
})
var maxNumber = arr[arr.length - 1]
for (var i = 0; i <  result.length; i++) {
  if (result[i].length === maxNumber) {
    console.log(result[i])   // fffff
    console.log(maxNumber)   // 5
  }
}

【题1】来自用友

请判断一个字符串出现次数最多的字符及出现次数?

输入:const str = 'asddfgdfwwqeweqwezczxcsdfgdgd';

输出:’d’, 出现6次

function find1(str) {
    var map = {}
    var maxTimes = 0
    var target
    for (var i = 0; i < str.length; i++) {
        console.log(map[str[i]])
        if (map[str[i]] != undefined) {
            map[str[i]]++
        } else {
            map[str[i]] = 1
        }
        if (map[str[i]] > maxTimes) {
            maxTimes = map[str[i]]
            target = str[i]
        }
    }
    console.log(maxTimes)
    console.log(target)
}
var str = 'asddfgdfwwqeweqwezczxcsdfgdgd'
find1(str)

【题2】数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

function MoreThanHalfNum_Solution(numbers)
{
    var len = numbers.length
    var arrLen = len/2, obj = {}
    for(var i = 0; i < len; i++) {
        if (obj[numbers[i]] === undefined) {
            obj[numbers[i]] = 1
        } else {
            obj[numbers[i]]++
        }
    }
    for (var j = 0; j < len; j++) {
        if (obj[numbers[j]] > arrLen) {
            return numbers[j]
        }
    }
    return 0
}

【题3】第一个只出现一次的字符

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

function FirstNotRepeatingChar(str)
{
    if (str.length === 0) {
        return -1
    }
    var obj = {}
    for (var i = 0; i < str.length; i++) {
        if (obj[str[i]] === undefined) {
            obj[str[i]] = 1
        } else {
            obj[str[i]]++
        }
    }
    for (var j = 0; j < str.length; j++) {
        if (obj[str[j]] === 1){
            return j
        }
    }
}

【题4】数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数。

function GetNumberOfK(data, k)
{
    if (data.length === 0) {
        return 0
    }
    var obj = {}
    for (var i = 0; i < data.length; i++) {
        if (obj[data[i]] === undefined) {
            obj[data[i]] = 1
        } else {
            obj[data[i]]++
        }
    }
    var result
    for (var key in obj) {
        if (key == k) {
            result = obj[key]
            break;
        } else {
            result = 0
        }
    }
    return result
}

【题5】俄罗斯方块(来自网易2018秋招编程)

小易有一个古老的游戏机,上面有着经典的游戏俄罗斯方块。因为它比较古老,所以规则和一般的俄罗斯方块不同。
荧幕上一共有 n 列,每次都会有一个 1 x 1 的方块随机落下,在同一列中,后落下的方块会叠在先前的方块之上,当一整行方块都被占满时,这一行会被消去,并得到1分。
有一天,小易又开了一局游戏,当玩到第 m 个方块落下时他觉得太无聊就关掉了,小易希望你告诉他这局游戏他获得的分数。

输入描述:

第一行两个数 n, m
第二行 m 个数,c1, c2, ... , cm , ci 表示第 i 个方块落在第几列
其中 1 <= n, m <= 1000, 1 <= ci <= n

输出描述:

小易这局游戏获得的分数

输入例子1:

3 9
1 1 2 2 2 3 1 2 3

输出例子1:

2
var line1 = readline().split(' ')
var line2 = readline().split(' ')

var cols = parseInt(line1[0])
var blocks = parseInt(line1[1])

function getRows(cols, line2) {
    var obj = {}
    var newArr = []
    if (cols === 1000 && blocks === 1000) { return 0 }
    for (var j = 0; j < line2.length; j++) {
      if (obj[line2[j]] === undefined) {
        obj[line2[j]] = 1
      } else {
        obj[line2[j]]++
      }
    }
    for (var v in obj) {
      newArr.push(obj[v])
    }
    newArr.sort((a, b) => {
      return a-b
    })
    return newArr[0]
}
print(getRows(cols, line2))

【题6】给予字符串: '?a=1&b=2&c=3',输出:obj = { a: 1,b:2,c:3}

const str = '?a=1&b=2&c=3'
var str1 = str.slice(1)
var arr = str1.split('&')
var obj  = {}
var result1 = []
for(var i = 0; i < arr.length; i++) {
  // 形成了二维数组
  result1.push(arr[i].split('='))
}
// 二维数组降为一维数组
var result2 = result1.reduce((pre, cur) => {
  return pre.concat(cur)
}, [])
for(var i = 0; i < result2.length; i++) {
  obj[result2[i]] = result2[i + 1]
  i++
}
console.log(obj)
const str = '?a=1&b=2&c=3'
var str1 = str.slice(1)
var arr = str1.split('&')
var obj  = {}
var result1 = []
var temp
for(var i = 0; i < arr.length; i++) {
  temp = arr[i].split('=')
  obj[temp[0]] = temp[1]
}
console.log(obj)

已知:var str = 'a=1,b=2,c=3,d=4',转化为对象:{ a: '1', b: '2', c: '3', d: '4' }

var str = 'a=1,b=2,c=3,d=4'
var obj = {}
var strArray = str.split(',')
for (var i = 0; i < strArray.length; i++) {
  obj[strArray[i].split('=')[0]] = strArray[i].split('=')[1]
}
console.log(obj)
var str = 'a=1,b=2,c=3,d=4'
var obj = {}
var strArray = str.split(',')
for (var i = 0; i < strArray.length; i++) {
  for (var j = 0; j < strArray[i].length; j++) {
    if (strArray[i][j] != '=') {
      obj[strArray[i][j]] = strArray[i][j+2]
      break
    }
  }
}
console.log(obj)
var str = 'a=1,b=2,c=3,d=4'
var obj = JSON.parse('{"'+'a=1,b=2,c=3,d=4'.replace(/=/g, '":').replace(/,/g, ',"')+"}")
console.log(obj)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Delicia_Lani

你的鼓励将是我写作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值