LeetCode算法题(长期更新)
1.给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
var twoSum = function(nums, target){
let res = new Map()
for(var i=0,len=nums.length;i<len;i++){
if(res.has(target - nums[i])) return [res.get(target-nums[i]), i] res.set(nums[i], i)
} console.log(res)
} twoSum([2,5,7,8,9], 15)
(2) [2, 3] ------------------------------------------------------------------------------------ // 类似给定数组,找出最大差值,最大的这个差值都是以右边 - 左边得出来的 如:var arr = [4,2,7,5,11,13,8,1] 当中最大差值是9 11-2 = 9
var arr = [4,2,7,5,11,13,8,1]
function maxDiff(arr){
if(arr.length<=1) return NaN
let min = Math.min(arr[0], arr[1])
let maxDiff = arr[1]-arr[0]
for(let i=0; i<arr.length; i++){
if(arr[i] > min) {
maxDiff = Math.max(maxDiff, arr[i]-min)
} else min = arr[i]
}
return maxDiff
}
console.log(maxDiff(arr))
[4,2,7,5,11,13,9,1].reduce((result, item, index, data) => Math.max(result, ...[...data].slice(0, index).map(v => item -v)));
[4,2,7,5,11,13,9,1].reduce((result, item, index, data) => Math.max(result, item - Math.min(...[...data].slice(0,index))));
// 给定一个整数无序数组和变量sum,如果存在数组中任意两项和使等于sum 的值,则返回true。否则 false
//例如数组 [3,5,1,4] 和sum=9
const findSum = (arr, sum) =>
arr.some((set => n => set.has(n) || !set.add(sum - n))(new Set));
var findSum = (arr, sum)=> arr.some((function(set){
return function (n){
return set.has(n) || !set.add(sum - n)
}
})(new Set))
第三大的数
var thirdMax = function(nums){
nums.sort((a, b)=> b-a) let map = new Map
for(let i = 0,len=nums.length; i<len; i++){
let cur = nums[i]
if(!map.get(cur)){
map.set(cur, 1)
if(map.size === 3) return cur
}
} return nums[0]
} console.log(thirdMax([2,3]))
2.递归案例:求一个数字,各个位数上的数字 和: 123 ---> 6
function getEverySum(x){
if(x<10) return x
return x % 10 + getEverySum(parseInt(x/10))
}
console.log(getEverySum(564564))
3. 数组 var arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5']
转换成:[ {key: 1, values: [2 , 3]}, {key: 2, values: [8, 4, 5]}, {key: 6, values: [10]}]
var arr = ['1-2', '2-8', '1-3', '2-4', '6-10', '2-5']
var fn = arr => {
var res = []
var obj = arr.reduce((pre, cur)=> {
var [k, v] = cur.split('-')
pre[k] ? pre[k].push(v): pre[k] = [v]
return pre
}, {}) for(const [key, values] of Object.entries(obj)){
res.push({key, values})
}
// arr.map(v => v.split('-')).reduce((pre, [k, v])=> {
(pre[k] = pre[k] || []).push(v)
return pre
}, {}) // return Object.entries(obj).map(([key, values])=> ({key, values})) return res
}
console.log(fn(arr))
4.实现一个sum方法使其有以下表现
sum(2,3).valueOf() // sum(2,3,4).valueOf() // sum(2,3)(4).valueOf() // sum(2,3,4)(2)(3,4).valueOf() //
// sum() 的结果可以继续使用 () 运算符,说明 sum() 返回的是一个函数(函数/函数表达式/箭头函数的统称);另外,这个返回值还有 valueOf() 方法,所以可以先搭个框
function sum() {
const fn = () => {};
fn.valueOf = () => {};
return fn;
} function sum(...args) {
const r = args.reduce((a, b) => a + b); const fn = (...args) => {
return sum(r, ...args);
}; fn.valueOf = () => r;
return fn;
}
------------------------------------------------------------------------------
// 类似 fn(1).value = 1 fn(1)(2).value = 5 fn(1)(2)(3).value = 14
function fn(){
const a = function(m){
a.value = m*m
return a
}
a.value = 1
return a
}
5.递归修改json的key值
var dataObject = {
"1": {
"name": "第一级1",
"type": "第一级2",
"describe": "第一级3",
"testNum": "第一级4",
"1-1": {
"name": "第二级5",
"type": "第二级6",
"describe": "第二级7",
"testNum": "第二级8",
"1-1-1": {
"name": "第三级9",
"type": "第三级q",
"describe": "第三级w",
"testNum": "第三级e"
}
}
}
};
// 将里面的1-1,1-1-1,1-2之类的值修改成对应的name字段里面的值,需要替换成下面这种的:
var dataObject = {
"第一级1": {
"name": "第一级1",
"type": "第一级2",
"describe": "第一级3",
"testNum": "第一级4",
"第二级5": {
"name": "第二级5",
"type": "第二级6",
"describe": "第二级7",
"testNum": "第二级8",
"第三级9": {
"name": "第三级9",
"type": "第三级q",
"describe": "第三级w",
"testNum": "第三级e"
},
"第三级r": {
"name": "第三级r",
"type": "第三级ty",
"describe": "第三级y",
"testNum": "第三级y"
}
}
}
}
function generate(obj) {
let _obj = {}
Object.entries(obj).forEach(([key, value]) => {
if (typeof value !== 'object') {
_obj[key] = value
} else {
_obj[value.name] = generate(value)
}
})
return _obj
} var res = generate(dataObject)
console.log(res)
6. 输入一个值获取最近的值,并返回
var arr = [
["IP-1", 0],
["IP-2", 13],
["IP-3", 68],
["IP-4", 138],
["IP-5", 149],
["IP-6", 834],
["IP-7", 1090],
["IP-8", 1247],
["IP-9", 1310],
["IP-10", 1956],
["IP-11", 2270],
["IP-12", 3337],
]
// 出入 200,返回 IP-7
var res = function (value) {
// 设置一个 map
const map = new Map()
// 设置每个 绝对值 和 name
arr.forEach(x => {
const number = Math.abs(value - x[1])
map.set(number, x[0])
})
// 得到 map里面最小的 value,得到名字
return map.get(Math.min.apply(null, Array.from(map.keys())))
}
console.log(res(2000)) // IP-10
7. 2个多维数组查找交集 打标识
var A = [
{id: 1},
{
id: 2,
children: [
{id: 3},
{id: 4},
{
id: 5,
children: [{
id: 6
}]
}
]
}
];
var B = [
{id: 1},
{
id: 2,
children: [{
id: 5,
children: [{
id: 6
}]
}]
}];
let c = method(A, B)
//结果
c = [
{id: 1, disabled: true},
{
id: 2,
disabled: true,
children: [
{id: 3},
{id: 4},
{
id: 5,
disabled: true,
children: [{
id: 6,
disabled: true
}]
}
]
}
];
function method (treeA, treeB) {
return dfs(treeA, new Set(flat(treeB)))
} function dfs (root, dict) {
for (node of root) {
if (dict.has(node.id)) {
node.disabled = true
}
if (node.children) {
dfs(node.children, dict)
}
}
return root
} function flat (root, path = []) {
for (node of root) {
path.push(node.id)
if (node.children) {
flat(node.children, path)
}
}
return path
}
8.查找对象的上一级
var arr = [
{
check: false,
child: [
{
check: false,
child: [
{
check: true,
},
{
check: true
}
]
},
{
check: false,
child: [
{
check: true,
},
{
check: false,
}
]
}
]
},
] // 实现结果:
var res= [
{
check: false,
child: [
{
check: true,
child: [
{
check: true,
},
{
check: true
}
]
},
{
check: false,
child: [
{
check: true,
},
{
check: false,
}
]
}
]
},
] --------------------------------------- function check (root) {
const _checkNode = x => x.check = x.child ? x.child.every(_checkNode) : x.check
root.forEach(_checkNode)
return root
}
var mapper = item =>
[item.child
&& (item.check = (item.child = item.child.map(mapper))
.filter(c => c.check).length === item.child.length)
, item][1]
console.dir(arr.map(mapper));
9
function Stack() {
let items = [] // 存储数据 // 从栈顶添加元素,也叫压栈
this.push = function (item) {
items.push(item)
} // 弹出栈顶元素
this.pop = function () {
return items.pop()
} // 返回栈顶元素
this.top = function () {
return items[items.length - 1]
} // 判断是否为空
this.isEmpty = function () {
return items.length == 0
} // 返回栈的大小
this.size = function () {
return items.length
}
} /*
* 思路:
* 遇到左括号,就把左括号压入栈中
* 遇到右括号,判断栈是否为空,为空说明没有左括号与之对应,缺少左括号,字符串括号不合法
* 如果不为空,则把栈顶元素移除,这对括号抵消了
*
* 当for循环结束后,如果栈是空,就说明所有的括号都抵消掉了
* 如果栈里还有元素,说明缺少右括号,字符串括号不合法
*
* */ -------------------------------
// 判断字符串里的括号是否合法
function is_leagl_brackets(string) {
let stack = new Stack()
for (var i=0; i< string.length; i++) {
var cur = string[i]
if (cur == '(') {
stack.push(cur)
} else if(cur == ')') {
if (stack.isEmpty()) {
return false
} else {
stack.pop()
}
}
} return stack.isEmpty()
} console.log('111------', is_leagl_brackets('fasdfadsf()(fdsa()fsa('))
console.log('222------', is_leagl_brackets('fasdfadsf()')) -------------------------------------- // 逆波兰表达式,也叫后缀表达式,他将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式
// 例如(a+b)*(c+d) 转换为ab+cd+*
//示例 ['4', '13', '5', '/', '+' ]等价于 (4 + (13/5)) = 6
// 4 入栈
// 13 入栈
// 5 入栈
// 遇到了 / 连续两次弹出栈顶元素 a b b / a = c c入栈
// 遇到 + 连续两次弹出栈顶元素 e f e + f = 6 6入栈 function calc_exp(exp) {
let stack = new Stack() for (let i = 0; i <exp.length; i++) {
let cur = exp[i]
if (['+', '-', '*', '/'].includes(cur)){
let val1 = stack.pop(), val2 = stack.pop()
let exp_str = val1 + cur + val2
// 计算并取整
var res = parseInt(eval(exp_str))
// 计算结果压入栈中
stack.push(res)
} else stack.push(cur)
} return stack.pop()
}
console.log('calc_exp(exp)------', calc_exp(['4', '13', '5', '/', '+' ]))
10.
var entry = {
a: {
b: {
c: {
dd: "abcdd"
}
},
d: {
xx: "adxx"
},
e: "ae"
}
}; // // 要求转换成如下对象
// var output = {
// "a.b.c.dd": "abcdd",
// "a.d.xx": "adxx",
// "a.e": "ae"
// } // 这道题是典型的DFS。这里有个技巧,就是将res作为参数传过去,
// 从而子函数(helper)可以对其进行修改。 这样我们可以不必依赖返回值,
// 也就避免了很多判断。 function helper(entry, prefix, res) {
for (const key in entry) {
if (entry[key] instanceof Object) {
helper(entry[key], `${prefix}.${key}`, res);
} else {
res[`${prefix.slice(1)}.${key}`] = entry[key];
}
}
} function format(entry) {
const res = {};
helper(entry, "", res);
return res;
} console.log(format(entry));
11.
list = [
{
id: 1,
label: 'a',
children: [{
id: 4,
label: 'b',
children: [{
id: 9,
label: 'c'
}, {
id: 10,
label: 'd'
}]
}]
}
] // 怎么根据label = c的条件 拿到 id为9的这条属性 varfind = (list, label) => {
let result;
for (let i = 0; i < list.length; i++) {
const item = list[i];
if (item.label === label) {
return result = item;
} else {
if (item.children) {
result = find(item.children, label);
}
}
}
return result;
}; var result = find(list, "c");
console.log(result);
12 求众数
给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于 n / 2 的元素
LeetCode算法题(长期更新)的更多相关文章
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Letter Case Permutation(Java实现)
这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
- LeetCode算法题-Jewels and Stones(Java实现)
这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
- LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)
这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...
随机推荐
- Java Day26进程01天
Java开启多个线程有两种方法,一种继承Thread类,一种实现Runnable接口.具体示例如下: 01继承Thread类 02实现Runnable接口
- 详解BOM用途分类及在汽车企业中的应用
摘要:在整车企业中,信息系统的BOM是联系CAD.CAPP.PDM和ERP的纽带,按照用途划分产品要经过产品设计,工程设计.工艺制造设计.生产制造4个阶段,相应的在这4个过程中分别产生了名称十分相似但 ...
- 4、订单详情 /items/order/detail?orderNo=201903251750380001
<template> <div class="write"> <div class="adr"> <div class ...
- aptana怎么显示空格 tab和回车等
- CSS3实现投影效果
Webkit引擎定义了-webkit-box-reflect属性,该属性能够实现投影效果,具体语法如下: -webkit-box-reflect: <direction> <offs ...
- Java学习笔记(二十):多态
什么是多态 多态的好处 举个例子:需求:给饲养员提供一个喂养动物的方法,用于喂养动物 假如没有多态,会发现针对不同类型的动物,我们需要提供不同的feed方法来喂养,当需求变化时,比如增加动物,就要增加 ...
- IO 、NIO、AIO
Java 中的流 https://ifeve.com/java-nio-vs-io/
- error link 2019 waveout
winmm.lib的影响 在做音频播放的时候使用到了win系统音频函数waveout; 但是报错: error link 2019 无法解析外部符号:waveoutGetnumDevice /clos ...
- 项目总结18-使用textarea无法判断空值之坑
项目总结18-使用textarea无法判断空值之坑 今天使用js判断textarea为空,发现怎么都无法成功仔细做了对比测试,发现结果如下: 1-JS代码 if($("#content&qu ...
- PCIe 驱动流程(LTSSM)
本次的工作是完成刚流片的FPGA中PCIe IP核的bring up,也就是芯片的中PCIe的第一个使用者,将PCIe IP核正常使用起来,并配合公司的EDA团队,完成PCIe IP核到用户的呈现. ...