js用到的算法

news2024/11/24 20:35:43

1.对象数组中,对象中有对象,数组根据对象中的对象打平

[
  {
    indexValueMap: { '68443': 0, '68457': 0 },
    rowName1: '固定收益类',
    rowName2: '交易类',
    rowName3: '次级'
  },
  {
    indexValueMap: { '68443': 0, '68457': 0 },
    rowName1: '固定收益类',
    rowName2: '交易类',
    rowName3: '中期'
  },
  {
    indexValueMap: { '68443': 0, '68457': 0 },
    rowName1: '权益类',
    rowName2: '',
    rowName3: 'A股'
  },
  {
    indexValueMap: { '68443': 0, '68457': 0 },
    rowName1: '权益类',
    rowName2: '',
    rowName3: '港股'
  }
]
[
  { '68443': 0, rowName1: '固定收益类', rowName2: '交易类', rowName3: '次级' },
  { '68457': 0, rowName1: '固定收益类', rowName2: '交易类', rowName3: '次级' },
  { '68443': 0, rowName1: '固定收益类', rowName2: '交易类', rowName3: '中期' },
  { '68457': 0, rowName1: '固定收益类', rowName2: '交易类', rowName3: '中期' },
  { '68443': 0, rowName1: '权益类', rowName2: '', rowName3: 'A股' },
  { '68457': 0, rowName1: '权益类', rowName2: '', rowName3: 'A股' },
  { '68443': 0, rowName1: '权益类', rowName2: '', rowName3: '港股' },
  { '68457': 0, rowName1: '权益类', rowName2: '', rowName3: '港股' }
]

方法:使用JavaScript的数组方法 .reduce() 来解决这个问题。.reduce() 方法在数组中的每个元素上执行一个reducer函数,并返回一个单一的输出值。

这段代码首先将原始数组array中的每一项curr中的indexValueMap的键值对作为对象推入累积器数组acc中。然后将每一项的其他属性rowName1rowName2rowName3添加到这个对象中。最后返回累积器数组,得到的结果就是你希望得到的形式。

let array = [  
  // ...你的原始数组  
];  
  
let result = array.reduce((acc, curr) => {  
  for (let key in curr.indexValueMap) {  
    acc.push({  
      [key]: curr.indexValueMap[key],  
      rowName1: curr.rowName1,  
      rowName2: curr.rowName2,  
      rowName3: curr.rowName3,  
    });  
  }  
  return acc;  
}, []);  
  
console.log(result);
function flattenArray(arr: any) {
  let result: any = [];
  arr.forEach((obj: any) => {
    let indexValueMap = obj.indexValueMap;
    let newObj = { ...obj }
    delete newObj.indexValueMap
    let newArr = []

    for (let key in indexValueMap) {
      let tempObj = JSON.parse(JSON.stringify(newObj))
      tempObj[key] = indexValueMap[key]
      newArr.push(tempObj)
    }
    result.push(newArr)
  })
  result = result.flat(1)
  return result;
}

2.树形结构数组,其中层级不一定,获取数组中最大的层级

这个问题的解决需要一个深度优先遍历(DFS)的算法。

getMaxLevel函数会遍历给定的数据数组,并使用深度优先搜索找出最大的层级。它在遍历每个节点时都会检查是否存在children属性,如果存在,则层级加一,并对每个子节点进行同样的处理。在遍历过程中,它会持续更新最大的层级数。最后,它会返回最大的层级数。

需要注意的是,这个函数假设给定的数据数组的结构是一致的,即每个对象都有labelNamechildrenindexValueMap属性,且children是一个对象数组。如果数据结构可能有所不同,你可能需要添加一些错误处理代码。

function getMaxLevel(data) {  
  let maxLevel = 0;  
  
  function dfs(node, level) {  
    if (node.children) {  
      level++;  
      for (let child of node.children) {  
        dfs(child, level);  
      }  
    }  
    maxLevel = Math.max(maxLevel, level);  
  }  
  
  for (let item of data) {  
    dfs(item, 0);  
  }  
  
  return maxLevel;  
}  
  
let data = [/* Your data */];  
console.log(getMaxLevel(data));

3.对象数组中,去除key值包含某个字符串的元素

 let flatArr = getFlattenArr(arr, 'indexMap')
//根据indexValueMao展开表格前去掉多余数据
function getFlattenArr(arr: any, delKey: any) {
  arr.map((obj: any) => {
    const keys = Object.keys(obj);
    keys.forEach((k) => {
      if (k.startsWith(delKey)) {
        delete obj[k]
      }
    })
    return obj
  });
  return arr
}

4.通过两个栈实现一个队列

栈和队列是两种常见的数据结构。栈遵循 LIFO(后进先出)原则,而队列遵循 FIFO(先进先出)原则。可以通过两个栈来实现一个队列。

class Queue {  
    constructor() {  
        this.stack1 = [];  
        this.stack2 = [];  
    }  
  
    enqueue(element) {  
        this.stack1.push(element);  
    }  
  
    dequeue() {  
        if (this.stack2.length === 0) {  
            while (this.stack1.length > 0) {  
                this.stack2.push(this.stack1.pop());  
            }  
        }  
        return this.stack2.pop();  
    }  
}

while() 是一个函数,而不是一个语句。它用于在满足某个条件的情况下反复执行代码块。

while() 函数的语法如下:

while (condition) {  
  // code to be executed while the condition is true  
}

在这个语法中,condition 是一个表达式,它会在每次循环迭代之前进行评估。如果 condition 的值为 true,则执行循环体内的代码;否则,循环会终止。

5.二叉树中,有三种常见的遍历方式:前序遍历、中序遍历和后序遍历。

  1. 前序遍历 (Preorder Traversal)

在前序遍历中,首先访问根节点,然后递归地访问左子树,最后访问右子树。

function preorderTraversal(root) {  
    const result = [];  
    function helper(node) {  
        if (node === null) return;  
        result.push(node.value); // 访问根节点  
        helper(node.left);       // 递归访问左子树  
        helper(node.right);      // 递归访问右子树  
    }  
    helper(root);  
    return result;  
}
  1. 中序遍历 (Inorder Traversal)

在中序遍历中,首先递归地访问左子树,然后访问根节点,最后递归地访问右子树。

function inorderTraversal(root) {  
    const result = [];  
    function helper(node) {  
        if (node === null) return;  
        helper(node.left);       // 递归访问左子树  
        result.push(node.value);  // 访问根节点  
        helper(node.right);       // 递归访问右子树  
    }  
    helper(root);  
    return result;  
}
  1. 后序遍历 (Postorder Traversal)

在后序遍历中,首先递归地访问左子树,然后递归地访问右子树,最后访问根节点。

function postorderTraversal(root) {  
    const result = [];  
    function helper(node) {  
        if (node === null) return;  
        helper(node.left);       // 递归访问左子树  
        helper(node.right);       // 递归访问右子树  
        result.push(node.value);  // 访问根节点  
    }  
    helper(root);  
    return result;  
}

前序:1245367

中序:4251637

后序:4526731

四大算法:分治、回溯、贪心、动规

分治法是一种将问题划分为小规模子问题的算法设计策略。分治法通过将问题划分为更小的部分,然后分别解决这些子问题,最后将这些子问题的解合并以得到原始问题的解。分治法的主要步骤包括:分解、解决、合并。

一个著名的使用分治法设计的算法是快速排序。在快速排序中,我们选择一个基准元素,然后将数组划分为两个子数组:一个包含所有小于基准的元素,另一个包含所有大于或等于基准的元素。然后我们对这两个子数组递归地应用快速排序。

回溯法是一种通过探索所有可能的候选解来找出所有的解的算法。回溯算法会检查每一步决策是否正确,并“回溯”或撤销先前的决策,然后继续探索其他可能的决策。这种算法通常用于解决组合优化问题,如八皇后问题、图的着色问题、旅行商问题等。

一个典型的回溯算法的实现通常包括:一个递归函数,该函数通过调用自身来处理子问题,以及一个“剪枝”函数,该函数用于排除那些不可能是最优解的候选解。

ex1:回溯法-归并排序

Math.floor() 是JavaScript的一个内置函数,用于返回小于或等于一个给定数字的最大整数。换句话说,它向下取整。

Math.floor(3.7); // 返回 3  
Math.floor(3.8); // 返回 3  
Math.floor(-3.7); // 返回 -4  
Math.floor(-3.8); // 返回 -4
  function mergeSort(arr){ 
    if(arr.length === 1) return arr
    const midIdx = Math.floor(arr.length /2) 
    return merge(mergeSort(arr.slice(0,midIdx)), mergeSort(arr.slice(midIdx)))
  }
  // [1,3,5,7]--[2,4,6,8,9]
  function merge(leftArr, rightArr) {
    let temp = []
    while(leftArr.length>0 && rightArr.length>0){
      if(leftArr[0]<rightArr[0]){
        temp.push(leftArr.shift())
      }else{
        temp.push(rightArr.shift())
      }
    } 
    return temp.concat(leftArr).concat(rightArr) 
  }
  let arr = [1,8,3,9,5,4,6,2,7]
  console.log(mergeSort(arr)) //[1,2,3,4,5,6,7,8,9]
function mergeSort(arr) {  
  // 如果数组只有一个元素,直接返回  
  if (arr.length <= 1) {  
    return arr;  
  }  
  
  // 将数组分成两部分,分别进行递归排序  
  const mid = Math.floor(arr.length / 2);  
  const left = arr.slice(0, mid);  
  const right = arr.slice(mid);  
  return merge(mergeSort(left), mergeSort(right));  
}  
  
function merge(left, right) {  
  // 合并两个有序数组  
  const result = [];  
  let i = 0;  
  let j = 0;  
  
  while (i < left.length && j < right.length) {  
    if (left[i] < right[j]) {  
      result.push(left[i]);  
      i++;  
    } else {  
      result.push(right[j]);  
      j++;  
    }  
  }  
  
  // 将剩余元素添加到结果数组中  
  while (i < left.length) {  
    result.push(left[i]);  
    i++;  
  }  
  while (j < right.length) {  
    result.push(right[j]);  
    j++;  
  }  
  
  return result;  
}

ex2:分治-求平方根

ex3:分治-快排

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1258064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Skywalking接入实际应用做日志跟踪

Skywalking客户端挂载 从官网下载skywalking-agent客户端&#xff0c;并挂在到应用服务器指定目录 挂载到应用主机中,好处是解决打包应用镜像的时候&#xff0c;镜像过大&#xff0c;部署成本过高。 docker-compose部署应用,并接入skywalking服务,这里以gateway为例 versio…

【活动回顾】sCrypt在2023伦敦区块链大会上的精彩表现

2023伦敦区块链大会&#xff0c;是本年度最盛大的比特币及区块链行业活动。大会于2023年5月31日至6月2日&#xff0c;在伦敦女王伊丽莎白二世中心举行&#xff0c;旨在展示BSV区块链的真正潜力。 sCrypt Inc 的创始人兼 CEO 刘晓晖&#xff0c; 作为演讲嘉宾出席了会议。他向大…

FreeImage 编译安装

FreeImage下载&#xff1a; The FreeImage Project 点击第6行&#xff1a; Download FreeImage 3.18.0 或&#xff1a; wget http://downloads.sourceforge.net/freeimage/FreeImage3170.zip #解压 unzip FreeImage3170.zip -d freeImage 编译FreeImage源代码可能需要遵循…

BUUCTF刷题之路--ciscn_2019_es_21

这题考察的是一个栈迁移的知识。作为入门学习栈迁移是个不可多得的好题。程序简单并且是32位的架构。保护也没有开&#xff0c;因此对于理解栈迁移再好不过了。看一下这题的基本信息&#xff1a; 栈迁移的基本原理其实就是栈的空间不够我们利用。也就是不不足以覆盖返回地址&am…

基于单片机设计的超声波测距仪(采用HC-SR04模块)

一、前言 本项目是基于单片机设计的超声波测距仪&#xff0c;主要采用了STC89C52单片机和HC-SR04超声波测距模块。通过LCD1602液晶显示屏来展示测量的距离信息。 超声波测距技术是一种常见的非接触式测距方法&#xff0c;利用超声波的传播速度测量物体与测距器之间的距离。它…

「C++」类和对象1

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;C启航 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#xff1a;初识面向对象&#x1f349;类&#x1f34c;类的定义&#x1f34c;访问限定符&#x1f95d;类的…

CloudCompare 源码编译

一、下载源码 二、cmake 编译 这里面有四个比较重要的地方 1、源码的位置 2、生成的位置 3、项目的位置 4、qt 的位置 三、编译 开始测试&#xff0c;先用那个项目做测试 没有问题 然后用build的那个打开 加入Qt 的相关库到qcc中 启动项目生成cloudcompare 启动 ok ,完成…

阿里云ACE认证之国际版与国内版对比!

大厂疯狂裁员&#xff0c;互联网行业迎来寒冬&#xff0c;技术人员被动陷入疯狂内卷。在愈加内卷的IT领域&#xff0c;“云计算”作为少有的蓝海&#xff0c;无疑是打工人未来实现职场提升、摆脱内卷的绝佳选择&#xff01; 对于云计算行业的人来说&#xff0c;最值得考的肯定是…

守护机器智能时代,上海迅软科技终端防泄密方案横空出世!

客户简要介绍 某智能科技股份有限公司是一家专注于数字化、自动化和新能源的机器人公司。公司致力于为劳动密集程度比较高的行业制造有用且价格合理的机器人&#xff0c;目前已广泛应用于农业、园艺、施工、测绘和设施服务等领域。在新加坡、美国、瑞典、大陆及香港等多地有研发…

C++相关闲碎记录(1)

1、C绘制爱心图像 #include <iostream> #include <cmath>using namespace std;int main() {// 心形曲线公式 (x^2 y^2 - a)^3 - x^2*y^3 0double a 1;double bound 1.5 * sqrt(a);double step 0.05;for (double y bound; y > -bound; y - step) {for (do…

vue或uniapp中keep-alive的使用,(附带生命周期原理图)

什么是keep-alive&#xff1f; keep-alive是一个内置组件&#xff0c;用于缓存和管理组件的状态。 当 keep-alive包裹一个组件时&#xff0c;这个组件的状态将会被缓存起来&#xff0c;而不是每次重新渲染。这在多个视图之间切换时特别有用&#xff0c;可以避免重复的创建和销…

【Spring】Spring是什么?

文章目录 前言什么是Spring什么是容器什么是 IoC传统程序开发控制反转式程序开发理解Spring IoCDI Spring帮助网站 前言 前面我们学习了 servlet 的相关知识&#xff0c;但是呢&#xff1f;使用 servlet 进行网站的开发步骤还是比较麻烦的&#xff0c;而我们本身程序员就属于是…

leetcode:2864. 最大二进制奇数(python3解法)

难度&#xff1a;简单 给你一个 二进制 字符串 s &#xff0c;其中至少包含一个 1 。 你必须按某种方式 重新排列 字符串中的位&#xff0c;使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。 以字符串形式&#xff0c;表示并返回可以由给定组合生成的最大二进制奇数。…

什么是闭包和作用域链?

1. 什么是闭包 闭包指的是那些引用了另一个函数作用域中变量的函数&#xff0c;通常是在嵌套函数中实现的。 举个栗子&#xff0c;createCounter 接受一个参数 n&#xff0c;然后返回一个匿名函数&#xff0c;这个匿名函数是闭包&#xff0c;它可以访问外部函数 createCounte…

Centos7上面部署redis

Centos7上面部署redis 编写这个部署redis&#xff0c;只是为了另一个文章入侵redis做准备&#xff0c;网上还有好多类似的文章&#xff0c;这个单纯的就是部署安装&#xff0c;并简单的测试使用以下 关联其他文章 [1]VMware上面安装部署centos7镜像系统【详细含镜像】 [2]血的教…

多集群部署中的 Kubernetes 弹性 (RTO/RPO)

啊&#xff0c;Kubernetes&#xff01;我们DevOps挑战的万灵药。 Kubernetes是一个开源的容器编排工具&#xff0c;本应加速软件交付、保护我们的应用程序、降低成本并减少我们的头痛问题&#xff0c;对吗&#xff1f; 不过说真的&#xff0c;Kubernetes已经彻底改变了我们编…

kali系统复现环境:Vulfocus 提示服务器内部错误,请联系管理员的解决方法

Linux-kali系统复现环境&#xff1a;Vulfocus&&提示服务器内部错误&#xff0c;请练习管理员的解决方法 第一步&#xff1a; 先下载docker和docker-compose apt-get update apt-get install docker apt-get install docker-compose输入如下图命令&#xff0c;有版本…

HarmonyOS应用开发者基础认证【题库答案】

HarmonyOS应用开发者高级认证【题库答案】 一、判断 首选项preferences是以Key-Value形式存储数据&#xff0c;其中Key是可以重复。&#xff08;错&#xff09;使用http模块发起网络请求时&#xff0c;必须要使用on(‘headersReceive’&#xff09;订阅请求头&#xff0c;请…

恒温恒湿试验设备故障维修指南

恒温恒湿试验设备是一种用于模拟特定温度和湿度条件下的环境的设备&#xff0c;通常用于测试产品在不同环境条件下的性能。设备可能会出现故障&#xff0c;导致温湿度控制不准确或其他问题。以下是一般的故障排除和维修指南&#xff0c;但请注意&#xff0c;具体的维修步骤可能…

01:编译lua及C调用

我们今天在windows平台编译lua&#xff0c;生成 lua动态库,lua.exe&#xff0c;luac.exe 我把这个目录上传到giee&#xff0c;使用下面命令获取它: git clone gitgitee.com:jameschenbo/lua_c_application.git 或者直接访问:访问网页 目录结构如下&#xff1a; build.cmd 是…