01 - 字符串压缩 - js
描述
利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2bc5a3。
1.如果只有一个字符,1不用写
2.字符串中只包含大小写英文字母(a至z)。
示例1
输入:"aabcccccaaa"
返回值:"a2bc5a3"
思路:
1.两个指针slow和我fast,slow指向第一个重复字符的位置,fast向后遍历查找和slow指针指向位置字符相同的最后一个字符的位置。
2.fast指针停下表示下一个字符和当前slow位置的字符不相同,计算fast和slow位置的差值就可以得出当前这个字符连续出现了多少次
3.将字符和出现次数拼串(拼串之前要判断一下如果字符只出现了一次就不要将次数拼进字符串)
代码实现:
function compressString( param ) {
// write code here
let result = ''
let slow = 0
let fast = 0
// 这里用slow指针来判断边界,如果用fast的话 循环内部的if执行完之后就直接跳出循环了 最后一个字符出现的次数得不到
while(slow < param.length){
if(param[slow] === param[fast]){
fast ++
}else {
if(fast - slow === 1){
result += param[slow]
}else{
result += param[slow] + (fast - slow)
}
slow = fast
}
}
return result
}
02 - 三个数的最大乘积
描述
给定一个长度为 nn 的无序数组 AA ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。
示例1
输入:[3,4,1,2]
返回值:24
思路:
1.将数组排序,取数组后面的三个值max1,max2,max3,以及前两个min1和min2.
2.取max1 * max2 * max3,和min1 * min2 * max1中的最大值即可
代码实现:
function solve( A ) {
// write code here
A.sort((a , b) => a - b)
let max1 = A[A.length - 1]
let max2 = A[A.length - 2]
let max3 = A[A.length - 3]
let min1 = A[0]
let min2 = A[1]
return Math.max(max1 * max2 * max3, min1 * min2 * max1)
}
03 - 进制转换
描述
给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。
当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 ‘A’ 表示此位为 10 , ‘B’ 表示此位为 11 。
若 M 为负数,应在结果中保留负号。
示例1
输入:7,2
返回值:"111"
代码实现:
function solve( M , N ) {
// write code here
if(M === 0) return '0'
let bin = '0123456789ABCDEF'
let result = []
let flag = false
if(M < 0){
flag = true
// 这里要将负数取绝对值 不然后面的循环会变成死循环
M = -M
}
while(M){
result.push(bin[M % N])
M = Math.floor(M / N)
}
if(flag) result.push('-')
return result.reverse().join('')
}
04 - 旋转字符串
描述
字符串旋转:
给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(可以为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。
例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’切割换位后得到‘zanyou’和B相同,返回true。
再如:如果A=‘abcd’,B=‘abcd’,A切成‘abcd’和’’(空串),换位后可以得到B,返回true。
示例1
输入:"youzan","zanyou"
返回值:true
思路:
1.将A字符串执行A+A操作变成一个新字符串
2.includes方法判断newA里面包不包含B即可
代码实现:
function solve( A , B ) {
// write code here
if(A === B) return true
if(A.length != B.length) return false
let newStr = A + A
return newStr.includes(B)
}
05 - 合并二叉树
描述
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。
思路:
1.同时递归两棵树相同节点数据加和
2.将两颗树的节点全部和合并到第一颗树上
代码实现:
function mergeTrees( t1 , t2 ) {
// write code here
if(t1 == null) return t2
if(t2 == null) return t1
t1.val += t2.val
t1.left = mergeTrees(t1.left,t2.left)
t1.right = mergeTrees(t1.right,t2.right)
return t1
}
06 - 二进制中1的个数
描述
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
示例1
输入:10
返回值:2
说明:十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。
思路:
1.将目标数据转化成二进制数字判断其已经包含1的个数
2.用题目要求的个数剪掉二进制数字的长度再加上已经包含的个数即可
代码实现:
function NumberOf1(n)
{
// write code here
let flag = false
if(n < 0) {
flag = true
n = -n
}else if(n === 0) return 0
let result = []
let count = 0
while(n){
let remainder = n % 2
result.push(remainder)
n = Math.floor(n / 2)
if(remainder === 1){
count ++
}
}
if(!flag) return count
else return 32 - result.length + count
}
07 - 数组中只出现一次的数(其它数出现k次)
描述
给定一个长度为 n 的整型数组 arr 和一个整数 k(k>1) 。
已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。
请返回只出现了 1 次的数。
示例1
输入:[5,4,1,1,5,1,5],3
返回值:4
代码实现:
function foundOnceNumber( arr , k ) {
// write code here
let newArr = [...new Set(arr)]
let indexArr = new Array(newArr.length)
for(let i = 0; i < newArr.length; i ++){
indexArr[i] = 0
for(let j = 0; j < arr.length; j ++){
if(newArr[i] === arr[j]){
indexArr[i] ++
}
}
}
let minCountsNumIndex = indexArr.indexOf(Math.min(...indexArr))
return newArr[minCountsNumIndex]
}
08 - 二分查找
描述
请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
示例1
输入:[-1,0,3,4,6,10,13,14],13
返回值:6
说明:13 出现在nums中并且下标为 6
代码实现:
function search( nums , target ) {
// write code here
if(nums.length == 0) return -1
let left = 0
let right = nums.length
while(left < right){
let mid = Math.floor((left + right) / 2)
if(target < nums[mid]) right = mid - 1
else if(target > nums[mid]) left = mid + 1
else return mid
}
if(nums[left] === target) return left
else return -1
}