牛客面试高频算法题js(最长无重复子数组、删除链表的倒数第n个节点、大数加法、按之字形顺序打印二叉树、链表相加(二))

2023-11-14

最长无重复子数组

描述

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。

子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

数据范围:0\le arr.length \le 10^50≤arr.lengt**h≤105,0 < arr[i] \le 10^50<arr[i]≤105

示例1

输入:

[2,3,4,5]

复制

返回值:

4

说明:

[2,3,4,5]是最长子数组         

示例2

输入:

[2,2,3,4,3]

返回值:

3

说明:

[2,3,4]是最长子数组         

示例3

输入:

[9]

返回值:

1

示例4

输入:

[1,2,3,1,2,3,2,2]

返回值:

3

说明:

最长子数组为[1,2,3]        

示例5

输入:

[2,2,3,4,8,99,3]

返回值:

5

说明:

最长子数组为[2,3,4,8,99]      

代码:

/**
 * 
 * @param arr int整型一维数组 the array
 * @return int整型
 */
function maxLength( arr ) {
// 方法一
//    创建一个集合
    let map=new Map();
//    初始化最大值
    let max=-1;
//     i用来遍历数组,j用来存储子数组初始下标
    let i,j,len=arr.length;
    for(i=0,j=0;i<len;i++){
//         判断map中是否重复存在arr[i];
        if(map.has(arr[i])){
//             有重复,即判断当前值在map中的下标和之前存储的下标那个大,改变当前下标
            j=Math.max(j,map.get(arr[i])+1);      
        }
//         存储当前值
        map.set(arr[i],i);
//         判断当前最大值与当前值的下标减去子数组初始下标加一后那个大
        max=Math.max(max,i-j+1);
    }
    return max;

}
module.exports = {
    maxLength : maxLength
};

删除链表的倒数第n个节点

描述

给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,

给出的链表为: 1\to 2\to 3\to 4\to 51→2→3→4→5, n= 2n=2.
删除了链表的倒数第 nn 个节点之后,链表变为1\to 2\to 3\to 51→2→3→5.

数据范围: 链表长度 0\le n \le 10000≤n≤1000,链表中任意节点的值满足 0 \le val \le 1000≤val≤100

要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
备注:

题目保证 nn 一定是有效的

示例1

输入:

{1,2},2    

返回值:

{2} 

方法一:

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
  * 
  * @param head ListNode类 
  * @param n int整型 
  * @return ListNode类
  */
function removeNthFromEnd( head ,  n ) {
    // write code here
    let p1=head,count=0;
    while(p1){
        count++;
        p1=p1.next
    }
    let sum =count-n-1;
    let p2=head;
    while(sum>0){
        p2=p2.next;
        sum--;
    }
    if(sum==0){
        p2.next=p2.next.next;
    }else{
       head=head.next;
    }
        
    return head;
}
module.exports = {
    removeNthFromEnd : removeNthFromEnd
};

方法二:

 let count=0;
    let p=head;
    let arr=[]
    while(p){
        count++;
        arr.push(p.val)
        p=p.next;
    }
    
    let cur=new ListNode(null);
    let pre=cur;
    
    let sum=count-n;
    for(let i=0;i<arr.length;i++){
        if(i==sum){
            continue;
        }
        let node=new ListNode(arr[i]);
        pre.next=node;
        pre=pre.next;
    }
    return cur.next;

NC1 大数加法

描述

以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:s.length,t.length \le 100000s.lengt**h,t.lengt**h≤100000,字符串仅由’0’~‘9’构成

要求:时间复杂度 O(n)O(n)

示例1

输入:

"1","99"

返回值:

"100"

说明:

1+99=100       

示例2

输入:

"114514",""

返回值:

"114514"

代码:

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 计算两个数之和
 * @param s string字符串 表示第一个整数
 * @param t string字符串 表示第二个整数
 * @return string字符串
 */
function solve( s ,  t ) {
    let str="";
    let len1=s.length,len2=t.length;
    let i,j;
    
//     使两个数值位数一致
    while(len1>len2){
        t="0"+t;
        len2++;
    }
    
    while(len2>len1){
        s="0"+s;
        len1++;
    }
    
    let up=0;//定义进位
//     从后往前相加
    for(i=len1-1;i>=0;i--){
//        两位数值相加并加上进位
        let temp=Number(s[i])+Number(t[i])+up;   
        str=str+(temp%10+"");
//         更新进位
        up=Math.floor(temp/10);
    }
//     判断最后是否还需进位
    if(up){
       str=str+(up+"");
    }
//     将结果反转并拼接
    let str1=str.split("").reverse().join("");
    return str1;
}
module.exports = {
    solve : solve
};

NC14 按之字形顺序打印二叉树

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足 |val| <= 1500∣val∣<=1500
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)

例如:
给定的二叉树是{1,2,3,#,#,4,5}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KxUl1tJh-1658562105920)(https://uploadfiles.nowcoder.com/images/20210717/557336_1626492068888/41FDD435F0BA63A57E274747DE377E05)]

该二叉树之字形层序遍历的结果是

[

[1],

[3,2],

[4,5]

]

示例1

输入:

{1,2,3,#,#,4,5}

复制

返回值:

[[1],[3,2],[4,5]]

复制

说明:

如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。     

示例2

输入:

{8,6,10,5,7,9,11}

返回值:

[[8],[10,6],[5,7,9,11]]

示例3

输入:

{1,2,3,4,5}

返回值:

[[1],[3,2],[4,5]]

方法一:

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Print(pRoot)
{

    let res=[];
    let p=[];
    p.push(pRoot);
    let x=1;
    if(pRoot==null){
        return []
    }

    while(p.length!=0){
        let len=p.length;
        res.push([]);
         let node;
        for(let i=0;i<len;i++){
//             判断节点是奇层还是偶数层
            if(x%2!=0){
//                奇数层,节点从数组头部弹出
                node=p.shift()
            }else{
//                偶数层节点从数组尾部弹出
                  node=p.pop()
            }
//            将节点从头部推入数组中
            res[res.length-1].unshift(node.val);
//             判断节点是奇层还是偶数层
            if(x%2!=0){
//                 奇数层,从右至左判断是否存在左右节点,如果存在则将节点从尾部推入数组
                   if(node.right)
                   p.push(node.right);
                 if(node.left)
                    p.push(node.left)       
//                 偶数层,从左至右判断是否存在左右节点,如果存在则将节点从头部推入数组
                 if(node.left)
                    p.unshift(node.left);
                 if(node.right)
                   p.unshift(node.right);       
            }
        }
         x++;
    }

    return res;
}
module.exports = {
    Print : Print
};

方法二:

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Print(pRoot)
{

    let res=[];
    let p=[];
    p.push(pRoot);
    let x=1;
    if(pRoot==null){
        return []
    }

    let temp=[]
    //         判断q当前的长度是否为0,如果为0则层序遍历结束
    while(p.length!=0){
//         存储当前q的长度
        let currentlength=p.length;
//         给存储数组推入一个空数组
//         res.push([]);
        temp=[]
//         循环遍历当前层的节点
        for(let i=0;i<currentlength;i++){
//             弹出q内的节点
            let node=p.shift();
//             将节点值存入res新加入的数组中
            temp.push(node.val);
//             判断当前节点是否有左孩子
            if(node.left!=null)
//                 有则向q推入下层节点
                p.push(node.left);
//             同上
            if(node.right!=null)
                p.push(node.right);
        }
//         判断该层是奇数层还是偶数层
        if(x%2==0){
//             如果为偶数层则将该层数组反转
             res.push(temp.reverse())
     
        }else{
//             如果为偶数层则无需反转
            res.push(temp)
        }
        x++;
    }
    return res;
}
module.exports = {
    Print : Print
};

NC40 链表相加(二)

描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

数据范围:0 \le n,m \le 10000000≤n,m≤1000000,链表任意值 0 \le val \le 90≤val≤9
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

在这里插入图片描述

示例1

输入:

[9,3,7],[6,3]

返回值:

{1,0,0,0}

说明:

如题面解释     

示例2

输入:

[0],[6,3]

返回值:

{6,3}

备注:

1 \leq n, m \leq 10^61≤n,m≤106
0 \leq a_i, b_i \leq 90≤ai,bi≤9

方法一:

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 * 
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
 */
function addInList( head1 ,  head2 ) {
//     方法一
    let p1="",p2="",len1=0,len2=0;
    let cnt="";
//     将链表中的值取出形成一个字符串
    while(head1){
        p1+=head1.val;
        head1=head1.next;
        len1++;
    }
    
    while(head2){
         p2+=head2.val;
        head2=head2.next;
        len2++;
    }
//     以下操作和大数加法相同
    while(len1>len2){
        p2="0"+p2;
        len2++;
    }
    while(len2>len1){
        p1="0"+p1;
        len1++;
    }
     let temp;
    let up=0;
    for(let i=len1-1;i>=0;i--){
        temp=Number(p1[i])+Number(p2[i])+up;
        cnt+=temp%10;
        up=Math.floor(temp/10);
    }
    
    if(up){
         cnt+=up
    }
//     新建链表
    let p=new ListNode(Number(Number(cnt[cnt.length-1])));
//     定义指向链表的指针
    let cur=p;
//     将结果形成新的链表
    for(let i=cnt.length-2;i>=0;i--){
       cur.next=new ListNode(Number(cnt[i]));
       cur=cur.next;
    }
    
//     返回链表
    return p;
}
module.exports = {
    addInList : addInList
};

方法二:

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 * 
 * @param head1 ListNode类 
 * @param head2 ListNode类 
 * @return ListNode类
 */
function addInList( head1 ,  head2 ) {
    let p1=null,p2=null;
    let cur1=head1,cur2=head2,len1=0,len2=0;
//     反转第一条链表
    while(cur1){
        let temp=cur1.next;
        cur1.next=p1;
        p1=cur1;
        cur1=temp;
        len1++;
    }
    
//     反转第二条链表
    while(cur2){
        let temp=cur2.next;
        cur2.next=p2;
        p2=cur2;
        cur2=temp;
        len2++;
    }
//   比较两条链表的长度,cur1指向长的链表,cur2指向短的链表  
    cur1=len1>=len2?p1:p2;
    cur2=len2<=len1?p2:p1;
    let up=0;
    let x=cur1;
//     循环链表
    while(cur1){
//     将链表上的数字相加
     let temp =cur1.val+ ((cur2 ? cur2.val : 0) +up)
       up=Math.floor(temp/10);
        cur1.val=temp%10; 
//         另x指向cur1
        x=cur1;
        cur1 =  cur1.next
        cur2 = cur2 ? cur2.next : null
    }
// 判断是否需要进位
    if(up){
        x.next=new ListNode(up);
//         cur1=x.next;
    }
    
    let pre=null,pre2;
//     令cur1指向较长的链表并让其反转
    cur1=len1>=len2?p1:p2;
    while(cur1){
        let temp=cur1.next;
       cur1.next=pre;
        pre=cur1;
       cur1=temp;
    }
    
    return pre;
}
module.exports = {
    addInList : addInList
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客面试高频算法题js(最长无重复子数组、删除链表的倒数第n个节点、大数加法、按之字形顺序打印二叉树、链表相加(二)) 的相关文章

  • WinRT 上的 C++、C# 和 JavaScript [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 从下图中可以看出 Windows 8
  • HTMLPanel 中的 JavaScript

    我想在 HTMLPanel 元素中包含 Javascript 代码 但它不起作用 请你帮助我好吗 提前致谢 脚本 pro js alert hello 使用 HTMLPANEL 不起作用 不显示警报 我认为应该是相反的 HTMLPanel
  • 在 sinon.js 中存根和/或模拟类?

    我已经为我的应用程序创建了一个数据库包装器 如下所示 为了测试它 我显然想替换实际的数据库 我可以创建一个新类来模拟query方法并捕获那里的所有输入 但是使用sinon js看起来更合适 但是我该如何使用它呢 Is the mock or
  • 如何使用 jquery 在 ajax 调用中设置标头

    我需要从我自己的应用程序调用 Office 365 Rest API 当我在同一浏览器会话上复制并粘贴 url 时 我可以看到一些 XML 如果我将该 URL 粘贴到隐身窗口中 则会收到以下错误 The custom error modul
  • 如何使用画布调整图像大小然后裁剪图像

    我已经知道如何 gt 调整图像大小 var image document getElementById myImage canvas document createElement canvas ctx canvas getContext 2
  • jQuery:当使用 on .scroll 事件和警报时,firefox 似乎无限循环

    我的主模板之一中有以下 jQuery 代码 document scroll function var scroll top document scrollTop alert scroll top if scroll top lt 70 fi
  • React Native 中的动画背景颜色

    我将如何在 React Native 中将一种颜色动画化为另一种颜色 我发现通过插入 Animated Value 您可以通过以下方式对颜色进行动画处理 var BLACK 0 var RED 1 var BLUE 2 background
  • IE9:奇怪的 JavaScript 错误

    我尝试在网站中显示 Google DFP 广告横幅时遇到错误 这些广告在除 IE9 之外的所有浏览器中展示 您可以在此处查看带有横幅的简单测试页面 离线演示 错误是 抛出异常但未捕获 google ads js 第 34 行字符 474 I
  • JavaScript 事件循环:队列、消息队列、事件队列

    阅读了大量 JavaScript 事件循环教程 我看到了不同的术语来标识当调用堆栈为空时准备由事件循环获取的队列存储消息 Queue 消息队列 事件队列 我找不到规范术语来识别这一点 甚至 MDN 似乎也对此感到困惑事件循环页面 https
  • Jquery 选择器中的冒号

    我最近将 jquery 从 1 4 更新到 2 1 并开始出现错误 在我的代码中 我有一部分通过 id 选择元素 jQuery id name 这会产生一个错误 但是之前没有错误 1 4 如果我转义冒号 错误就会消失 他们在最新版本中添加了
  • 根据路由动态加载 Node.js 模块

    我正在使用 Express 在 Node js 中做一个项目 这是我的目录结构 root start js server js lib api user getDetails js user register js The lib api
  • 如何从 HTML 图表中删除网址 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在 HTML 中创建一个图表 我正在使用 API amCharts 但问题是它在图表中显示文本 amchart 我怎样才能删除该文本
  • 从 Web 浏览器控件读取 Javascript 变量

    我正在尝试读取从表单上的 WebBrowser 控件加载和调用的 Javascript 变量的值 Example index html 引用名为 test js 的 javascript 在 test js 上 创建并填充了几个变量 然后i
  • 时间序列折线图与轴不同步

    本实验基于这个d3官方例子 http bost ocks org mike path 我想要实现的是可视化时间序列数据的最后 x 分钟 我有这个代码的副本jsfiddle http jsfiddle net 225dC 3 单击以添加新数据
  • 如何在 AngularJS 中设置选择选项中的文本格式?

    我有以下 json 对象 scope values id 2 code Code 1 name Sample 1 id 4 code Code 2 name Sample 2 id 7 code Code 3 name Sample 3 在
  • Google Calendar API:获取指定日期的空闲时段列表

    我需要获取我的谷歌日历中的免费时段列表 现在我只是获取事件列表 我在用谷歌日历 https www npmjs com package google calendar npm google calendar events list calO
  • Vue js - 在同一级别的两个组件内传递数据

    我有需要从一个传递的数据component1到另一个component2 我不使用vuex or router 组件树 Parent Component1 Component2 从一开始component1我发出 ajax 请求 检索信息并
  • 为什么事件属性不容易获取?

    我有以下代码 HERE https jsfiddle net 5n2zagjc 2 是可编辑的示例 用法 在输入字段中键入并观看控制台 function test event let keys Object keys event let k
  • 使用与 eval 相反的括号表示法

    我有以下内容 var module function console log module ran var someString module string TypeError object is not a function eval s
  • Google Maps JavaScript API v3 方向功能

    我使用 Google Maps js API v3 我可以根据路径点显示方向this http code google com intl hu apis maps documentation directions Waypoints 我想要

随机推荐

  • mysql启动命令

    1 查看mysql版本 方法一 status 方法二 select version 2 Mysql启动 停止 重启常用命令 a 启动方式 1 使用 service 启动 root localhost service mysqld start
  • 清华大学,AIGC发展研究,162页PDF

    点击上方 Python与机器智能 选择 星标 公众号 第一时间获取价值内容 收集不宜 我将资料免费分享在我的星球 后续也将会持续更新 欢迎大家加入我的这个 AIGC与GPT 知识星球 价格便宜 目前已有近130人 作为一个大厂算法工程师和机
  • C++ 封装 类

    封装 可以达到 对外提供接口 屏蔽数据 对内开放数据 比如我们用struct封装的类 即知其接口 又可以直接访问其内部数据 这样却没有达到信息隐蔽的功效 而class则提供了这样的功能 屏蔽内部数据 对外开放接口 struct中所有行为和属
  • 渣硕2020暑期实习面经

    春招也基本结束了 拿了点offer 因为一开始就没有准备找区块链方向岗位 所以准备的还是研发岗 简历写了一些分布式 所以分布式理论问的也蛮多 感觉形势蛮严峻的 好多厂貌似都不开放暑期实习了 个人比较遗憾的就是微软笔试时候浏览器没搞好 导致没
  • 错误使用 network/subsasgn>network_subsasgn (line 550) net.IW{1,1} must be a 16-by-19 matrix. 出错 network

    该代码为基于PSO和BP网络的预测 清空环境 clc clear 读取数据 load CHE2 mat 节点个数 inputnum 17 hiddennum 16 outputnum 1 训练数据和预测数据 input train inpu
  • mysql 集群 一主两从环境测试,MHA主备切换

    目录 前言 1 相关安装文件 2 虚拟机 mysql数据库安装 2 1 安装VMware 15 以及 linux 操作系统 2 2 安装mysql数据库 2 2 1安装环境准备 2 2 2 mysql 数据库安装 2 3 克隆centos虚
  • Cmake零基础教程——常用语法命令

    编译选项 在cmake脚本中 设置编译选项有两种方式 1 可以通过add compile options命令 2 也可以通过set命令修改CMAKE CXX FLAGS或CMAKE C FLAGS 存在即合理 那么使用这两种方式存在怎样的区
  • ssh和ftp登录的几种方式

    ssh登录的几种方式 本文为https www bilibili com video av755468030 笔记 1 密码账号登录 ssh p 1234 name 目标ip p 为指定端口 name为用户名 2 使用公钥私钥登录 获取指定
  • IDEA中javaweb项目导入外部jar包

    IDEA中javaweb项目导入外部jar包 打开Project Structure 选中Modules 选择Dependencies 点击 选择要导入的jar包或jar包文件夹 选中要使用的jar包或jar包文件夹 点击ok 如果只是按照
  • excel导出功能

    安装excel所需依赖和按需加载 由于 Export2Excel不仅依赖js xlsx还依赖file saver和script loader 所以你先需要安装如下命令 npm install xlsx file saver S npm in
  • React传参和定义变量

    react 声明变量 react传参
  • 学习linux内核的经典书籍介绍

    有关内核的书籍可以用汗牛充栋来形容 不过只有一些经典的神作经住了考验 首先是5本久经考验的神作 个人概括为 2 1 2 第一个2是指2本全面讲解内核的书 中间的1指1本讲解驱动开发的书 后面的2则指2本有关内核具体子系统的书 你是否想到了某
  • vscode 静态语法检测插件C/C++ Advanced Lint,ubuntu20.04安装clang、cppcheck

    远程环境 ubuntu20 04 本地开发环境 windows 11 开发IDE vscode 一 ubuntu20 04安装clang 安装llvm apt get install llvm 2 安装clang apt get insta
  • 11-数据结构-双链表的创建-输出-初始化-插入-删除

    问题 双链表的创建 输出 初始化 插入 删除 思路 搞清楚双链表是怎么样的 多了一个前指针 此外每次链接的时候 都是先连接好后面的再连接前面的 直接看代码吧 代码如下 include
  • 思科实验 voip通信的配置(内附命令超详细)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 一 实验目的和要求 二 实验设备
  • Python疫情数据爬取与可视化

    使用Python爬取腾讯新闻疫情数据 并使用pyecharts可视化 绘制增长人数地图 柱状图 折线图 文章目录 1 分析网页 2 导入模块 3 抓取数据 4 提取数据并写入Excel 5 国内各地区现有确诊人数地图 6 国内各地区现有确诊
  • 秒懂边缘云

    作者 辰舒 章节内容 如何配置解析记录 已有CNAME A记录时如何配置 如何检查解析配置是否生效 解析基本原理 前言 上个章节中我们学习了如何根据业务情况添加CDN域名并配置源站 但在添加完成后 域名尚未真正接入CDN服务 我们需要将域名
  • Kafka

    1 概述 1 1 定义 Kafka是一个分布式的基于发布 订阅模式的消息队列 主要应用于大数据实时处理领域 优势 kafka可以做到 使用非常普通的硬件 也可以支持每秒数百万的消息读写 MQ 代表消息队列 kafka只是众多mq中一款产品
  • Shell脚本编程入门--Day2

    文章目录 几个简单内置shell命令 shell字串的语法 计算变量长度的各种玩法 批量修改文件名 特殊shell扩展变量 实际应用 父子shell 创建进程列表 创建子shell 几个简单内置shell命令 echo n 不换行输出 e
  • 牛客面试高频算法题js(最长无重复子数组、删除链表的倒数第n个节点、大数加法、按之字形顺序打印二叉树、链表相加(二))

    最长无重复子数组 描述 给定一个长度为n的数组arr 返回arr的最长无重复元素子数组的长度 无重复指的是所有数字都不相同 子数组是连续的 比如 1 3 5 7 9 的子数组有 1 3 3 5 7 等等 但是 1 3 7 不是子数组 数据范