偶尔刷刷leetCode-过程记录

刷刷LeetCode题 记录一下过程

简单

题1

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

  • 每组都有 X 张牌。
  • 组内所有的牌上都写着相同的整数。

仅当你可选的 X >= 2 时返回 true

示例 1:

1
2
3
输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]

示例 2:

1
2
3
输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。

解:

这道题有些不好理解,但思路是拿到数组中重复数字的次数,他们存在最大公约数就可以组成1组或更多组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 取最大公约数的函数(30secondsofcode)
const gcd = (...arr) => {
let _gcd = (x, y) => (!y ? x : gcd(y, x % y))
return [...arr].reduce((a, b) => _gcd(a, b))
}
var hasGroupsSizeX = function(deck) {
// 记录相同数字出现的次数
let obj = {}
deck.forEach(v => { obj[v] ? obj[v]++ : obj[v] = 1 })
// 次数组成的数组
let arr = Object.values(obj)
// 返回boolean(1为不存在最大公约数)
return gcd(...arr) !== 1
}

总结:先拿到重复数字的次数组成的数组后取最大公约返回boolean,不太好理解的是gcd这个函数。

题2

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 :

1
2
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

解:

1
2
3
4
5
6
7
8
9
function reverseWords(s) {
let arr = []
s.split(/\s/).forEach(val => {
arr.push(
val.split('').reverse().join('')
)
})
return arr.join(' ')
}

习惯性使用forEach 这里可以使用map 更方便

1
2
3
function reverseWords(s) {
return s.split(' ').map(val => val.split('').reverse().join('')).join(' ')
}

也可以将split换成match正则的方式匹配单词

1
2
3
function reverseWords(s) {
return s.match(/[\w']+/g).map(val => val.split('').reverse().join('')).join(' ')
}

总结:其实就是使用了切割或整个匹配拿到每个单词进行翻转再转换为空格连接的字符串

中等

题1

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如电话按键相同。注意 1 不对应任何字母。

示例:

1
2
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
var letterCombinations = function(digits) {
// 空字符串return[]
if (digits.length <= 0) return []
// 用数组索引映射对应字母
let keyboard = [
undefined,
undefined,
'abc',
'def',
'ghi',
'jkl',
'mno',
'pqrs',
'tuv',
'wxyz'
]
// 最后输出的值
let comb = null
for (let i = 0; i < digits.length; ++i) {
// 当前对应的字母
let arr = keyboard[digits[i]]
if (!comb) {
comb = arr.split('')
} else {
// 存两两组合的值
let cache = []
// 循环组合
for (let i = 0; i < comb.length; ++i) {
for (let j = 0; j < arr.length; ++j) {
cache.push(comb[i] + arr[j])
}
}
// 记录新的组合后的数组
comb = cache
}
}
return comb
}

首先要写好数字与字母的映射关系,两两循环嵌套组合最后返回

------ 本文结束------
0%