一:一维数组的动态和
题目:
思路和算法:
代码一:
/**
* @param {number[]} nums
* @return {number[]}
*/
var runningSum = function(nums) {
var sum = 0
var arr = nums.map((item) => {
sum = sum + item
return sum
})
return arr
};
知识点: map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。
代码二:
/**
* @param {number[]} nums
* @return {number[]}
*/
var runningSum = function(nums) {
const n = nums.length
for(let i = 1; i < n; i++) {
nums[i] += nums[i-1]
}
return nums
};
二:赎金信
题目:
思路和算法:
题目要求使用字符串magazine 中的字符来构建新的字符串ransomNote,且ransomNote 中的每个字符只能使用一次,只需要满足字符串magazine中的每个英文字母(’a’-’z’)的统计次数都大于等ransomNote中相同字母的统计次数即可。
代码一:
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
if(ransomNote.length > magazine.length){
return false
}
var ransomNoteArray = new Array(26).fill(0)
var magazineArray = new Array(26).fill(0)
for(let item of ransomNote){
ransomNoteArray[item.charCodeAt() - 'a'.charCodeAt()]++
}
for(let item of magazine){
magazineArray[item.charCodeAt() - 'a'.charCodeAt()]++
}
for(let i = 0; i < 26; i++){
if(magazineArray[i] < ransomNoteArray[i]){
return false
}
}
return true
};
代码二(官方参考答案):
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
if(ransomNote.length > magazine.length){
return false
}
const cntArray = new Array(26).fill(0)
for(let item of magazine){
cntArray[item.charCodeAt() - 'a'.charCodeAt()]++
}
for(let item of ransomNote){
cntArray[item.charCodeAt() - 'a'.charCodeAt()]--
if(cntArray[item.charCodeAt() - 'a'.charCodeAt()] < 0){
return false
}
}
return true
};
三:Fizz Buzz
题目:
代码一:
/**
* @param {number} n
* @return {string[]}
*/
var fizzBuzz = function(n) {
var array = new Array(n).fill(0)
var newArray = array.map((item,index)=> {
if((index+1)%3 === 0 && (index+1)%5 === 0){
return 'FizzBuzz'
}else if((index+1)%3 === 0){
return 'Fizz'
}else if((index+1)%5 === 0){
return 'Buzz'
}else{
return (index + 1).toString()
}
})
return newArray
};
代码二(官方参考答案):
/**
* @param {number} n
* @return {string[]}
*/
var fizzBuzz = function(n) {
const answer = []
for(let i = 1; i <= n; i++){
const cb = []
if(i % 3 === 0){
cb.push("Fizz")
}
if(i % 5 === 0){
cb.push("Buzz")
}
if(cb.length === 0){
cb.push(i)
}
answer.push(cb.join(''))
}
return answer
};
四:链表的中间结点
题目:
知识点:
一:链表
什么是链表: 用一组任意存储的单元来存储线性表的数据元素。一个对象存储着本身的值和下一个元素的地址。
特点:
1,需要遍历才能查询到元素,查询慢。
2,插入元素只需断开连接重新赋值,插入快。
二:Math.trunc 用法:
Math.trunc(value)
参数:该函数接受单个参数值。它是要发送到Math.trunc()函数的浮点数。
返回值:Math.trunc()函数返回给定数字的整数部分。
代码一:
思路:将链表转换成数组
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function(head) {
var array = []
while(head){
array.push(head)
head = head.next
}
return array[Math.trunc(array.length/2)]
};
官方参考答案
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function(head) {
var array = [head]
while(array[array.length-1].next != null){
array.push(array[array.length-1].next)
}
return array[Math.trunc(array.length/2)]
};
代码二:
思路:快慢指针
说明:用两个指针slow与fast一起遍历链表。slow一次走一步,fast一次走两步。那么当fast到达链表的末尾时,slow必然位于中间。
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function(head) {
var fast = slow = head
while(fast && fast.next){
slow = slow.next
fast = fast.next.next
}
return slow
};
五:将数字变成 0 的操作次数
题目:
代码一
/**
* @param {number} num
* @return {number}
*/
var numberOfSteps = function(num) {
let ret = 0
while(num > 0){
if(num % 2 === 0){
num = num / 2
}else{
num--
}
ret++
}
return ret
};
代码二(官方答案)
/**
* @param {number} num
* @return {number}
*/
var numberOfSteps = function(num) {
let ret = 0
while(num > 0){
ret += (num > 1 ? 1 : 0) + (num & 0x01) // 判断奇偶
num >>= 1 // 右位移1位并且赋值
}
return ret
};
六:最富有客户的资产总量
题目:
思路:二维数组遍历的问题
代码一:
/**
* @param {number[][]} accounts
* @return {number}
*/
var maximumWealth = function(accounts) {
let sum = new Array(accounts.length).fill(0)
for(let i = 0; i < accounts.length; i++) {
for(let j = 0; j < accounts[i].length; j++){
sum[i] += accounts[i][j]
}
}
return Math.max(...sum)
};
代码二(官方答案):
Number.MAX_VALUE 属性表示在 JavaScript 里所能表示的最大数值。
reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
/**
* @param {number[][]} accounts
* @return {number}
*/
var maximumWealth = function(accounts) {
let maxWealth = -Number.MAX_VALUE
for(const account of accounts){
maxWealth = Math.max(maxWealth, account.reduce((a,b) => a+b))
}
return maxWealth
};