JS leetcode 加一 题解分析

壹 ❀ 引
今天是刷leetcode的第三天,根据推荐优先刷数据结构相关的卡片,先把数据结构知识体系建立起来,不然就是题目无从下手答案也看不懂的尴尬局面。那么今天的题目是加一,老规矩,先记录自己的解题思路,再分析优质答案。
题目如下:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
那么本文开始。
贰 ❀ 聪明但失策的方法
我们先来分析题目,题目想表达的意思是给一个整数组成的非空数组,比如数字123装在数组中就是[1,2,3],我们得在123的基础上加1,所以输出得是[1,2,4]。注意,每个元素只能是单个数字,所以不会存在[1,20,4]类似的情况。
我首先想到的就是对数组进行倒序遍历,比如看最后一位数字是否小于9,如果小于则直接把尾数加1,直接返回返回数组即可:
if (arr[length - 1] < 9) {
arr[length] += 1;
return arr;
};
那么如果尾数是9,就得把尾数变成0,并将尾数前一位数字加1,可这样就麻烦了,如果前面尾数刚好又是9怎么办,那岂不是变成了10,题目要求每个数字只能有一位,所以像[9,9]加1就得变成[1,0,0]。
当我还在想还要怎么处理时,突然灵机一动,不对啊,数字计算进位的事情交给数字自己去做不就好了,我为什么要花心思管,直接将数组转成数字,让数字自增1,再还原成数组岂不妙哉!
于是我写了如下代码:
var plusOne = function (digits) {
// 1.将数组切割成字符串
// 转数字并加1
// 转字符串并再次切割成数组
return (Number(digits.join("")) + 1).toString().split("");
};
拿官方给的两个例子测试了下,没问题,果断提交,然后挂了....
具体挂在了[6, 1, 4, 5, 3, 9, 0, 1, 9, 5, 1, 8, 6, 7, 0, 5, 5, 4, 3]这个例子,正确答案很明显是[6, 1, 4, 5, 3, 9, 0, 1, 9, 5, 1, 8, 6, 7, 0, 5, 5, 4, 4],但我的代码却输出了["6", "1", "4", "5", "3", "9", "0", "1", "9", "5", "1", "8", "6", "7", "0", "5", "0", "0", "0"],这我就蒙圈了。
经过一番百度,这才发现了Number能表示的正负安全范围为-253到253,而上述使用Number加1的数字为6145390195186705544,已经超过了有效范围。
当然也不是没有解决方案,通过ES10的BigInt来解决数字超出范围失去精度问题,使用也比较简单,在数组默认加个n,经过修改:
var plusOne = function (digits) {
// 借用BigInt解决数字超出范围的问题
return (BigInt(digits.join('')) + 1n).toString().split('');
};
OK,这下通过了测试。
叁 ❀ 无法逃避的更佳实现
上文的思路虽然很棒,跳出了看到数组本能想到遍历的固有思路,但致命缺陷是BigInt毕竟是ES10的东西,ES6都没完全得到浏览器支持,更何况说10,玩意面试遇到了这题被面试官也这么说,那不GG。
所以我还是没能逃过最初的思路,让数组倒序遍历,并手动控制数字自增,比如[1,2]变成[1,3],像[9,9]我们可以先变成[0,0]再塞个1进去,上代码:
/**
* @param {number[]} digits
* @return {number[]}
*/
var plusOne = function (digits) {
var last = digits.length - 1;
while (last >= 0) {
// 如果最后一位数小于9,那么自增加1就可以返回
if (digits[last] < 9) {
digits[last] += 1;
return digits;
} else {
//反之加1等于10,所以先把这一位设置成0
digits[last] = 0;
};
last--;
};
// 考虑到[9,9]的情况,遍历完就成了[0,0]了,所以得从头部加个1进去
if (digits[0] == 0) {
digits.unshift(1);
};
return digits;
};
注释已经写得很清楚了,这里就不多解释,而且这段代码虽然看起来比较多,但是运行时间要远远低于第一种实现方法。
那么关于这道题就说到这里了,本文结束。
JS leetcode 加一 题解分析的更多相关文章
- 在HTML中使用JavaScript(浏览器对js的加载机制分析)
前言: 向HTML页面中插入JavaScrip的主要方法,就是使用<script>标签.主要探讨<script>标签的在HTML页面的渲染机制.对应的业务场景:从js的加载机制 ...
- javascript图片懒加载与预加载的分析
javascript图片懒加载与预加载的分析 懒加载与预加载的基本概念. 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片, ...
- JS懒加载
4.如何使用js懒加载图片 a.懒加载图片是基于jquery.js的,所以: <script src="jquery.js" type="text/ja ...
- JS模块加载器加载原理是怎么样的?
路人一: 原理一:id即路径 原则.通常我们的入口是这样的: require( [ 'a', 'b' ], callback ) .这里的 'a'.'b' 都是 ModuleId.通过 id 和路径的 ...
- 转:web前端面试题合集 (Javascript相关)(js异步加载详解)
1. HTTP协议的状态消息都有哪些? 1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请 ...
- 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)
一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范. 1.AMD(Asy ...
- Arcgis for Js之加载wms服务
概述:本节讲述Arcgis for Js加载ArcgisServer和GeoServer发布的wms服务. 1.定义resourceInfo var resourceInfo = { extent: ...
- 【 js 模块加载 】【源码学习】深入学习模块化加载(node.js 模块源码)
文章提纲: 第一部分:介绍模块规范及之间区别 第二部分:以 node.js 实现模块化规范 源码,深入学习. 一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须 ...
- (转载)arcgis for js - 解决加载天地图和WMTS服务,WMTS服务不显示的问题,以及wmts服务密钥。
1 arcgis加载天地图和wmts服务 arcgis for js加载天地图的例子网上有很多,这里先不写了,后期有空再贴代码,这里主要分析下WMTS服务为什么不显示,怎么解决. 条件:这里的WMTS ...
- 前端性能优化 css和js的加载与执行
一个网站在浏览器端是如何进行渲染的? html本身首先会被渲染成 DOM 树,实际上 html 是最先通过网址请求过来的,请求过来之后,html 本身会由一个字节流转化成一个字符流,浏览器端拿的就是字 ...
随机推荐
- go 接口学习笔记
这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...
- 基于html5+javascript技术开发的房贷利率计算器,买房的码农们戳进来
房贷计算器是一款专为购房者设计的实用工具应用,其主要功能是帮助用户详细计算房贷的还款金额.利息以及还款计划等.通过这款软件,用户可以更加便捷地了解到自己的还款情况和计划,从而更好地规划自己的财务.下面 ...
- Go-单链表-栈和队列
package main import ( "errors" "fmt" "log" ) // 单链表 // 特征: // 1. 每个节点都 ...
- QT5.9移植到海思HI3520设备上运行
前言: 在海思HI3520DV300上调试QT5.9.0有一小段时间了,这里将遇到的比较典型的问题做一个记录,以备后续查询,也可给同行一个参考.本人只使用过QT5.9.0这一个版本,如有描述错误欢迎指 ...
- 3 分钟了解 NVIDIA 新出的 H200
英伟达在 2023 年全球超算大会上发布了备受瞩目的新一代 AI 芯片--H200 Tensor Core GPU.相较于上一代产品 H100,H200 在性能上实现了近一倍的提升,内存容量翻倍,带宽 ...
- Nginx arm编译安装
Nginx arm编译安装 背景 计划编译一套产品. 能够比较方便快捷的进行 nginx的交付. 主要思想是源码编译 不仅能够在arm上面运行 也可以在x86上面编译 考虑性能还有一些扩展性. 高效处 ...
- [转帖]ubuntu下配置iptables、ufw端口转发
iptables 端口转发(CentOS) 注意:一来一去 在中转服务器操作 iptables -t nat -A PREROUTING -p tcp --dport [端口号] -j DNAT -- ...
- Ubuntu编译Xilinx的u-boot
博主这里的是Ubuntu20.04LTS+Vivado2017.4+ZedBoard 注意:本文使用的环境变量导入方法是临时的,只要退出当前终端或者使用其他终端就会失效,出现异常问题,请随时expor ...
- mac接入两根网线
mac机接了USB扩展槽之后,扩展槽可以接入一根网线,机器自带一个网线口,这样就可以同时接入两根网线,为什么要这样做? 因为我所在的公司是分内外网的,研发的机器是内网环境,而打包机有时候需要联网,那么 ...
- vim 从嫌弃到依赖(15)——寄存器
在计算机里面也有寄存器,计算机中的寄存器是看得见,摸得着的实体,寄存器中存储需要经常访问的一些数据.而vim中也有寄存器的概念,vim中的寄存器是一个虚拟的概念,更像是一块专门用来存储数据的内存缓冲区 ...