前端可以用java写力扣吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端可以用java写力扣吗相关的知识,希望对你有一定的参考价值。

前端刷题用js还是java
前端刷题用js还是java_用javascript刷LeetCode的正确姿势

韦桂超
原创
关注
0点赞·1164人阅读
虽然很多人都觉得前端算法弱,但其实 JavaScript 也可以刷题啊!最近两个月断断续续刷完了 leetcode 前 200 的 middle + hard ,总结了一些刷题常用的模板代码。走过路过发现 bug 请指出,拯救一个辣鸡(但很帅)的少年就靠您啦!
常用函数

包括打印函数和一些数学函数。

const _max =Math.max.bind(Math);

const _min=Math.min.bind(Math);

const _pow=Math.pow.bind(Math);

const _floor=Math.floor.bind(Math);

const _round=Math.round.bind(Math);

const _ceil=Math.ceil.bind(Math);

const log=console.log.bind(console);//const log = _ =>

log 在提交的代码中当然是用不到的,不过在调试时十分有用。但是当代码里面加了很多 log 的时候,提交时还需要一个个注释掉就相当麻烦了,只要将 log 赋值为空函数就可以了。

举一个简单的例子,下面的代码是可以直接提交的。

//计算 1+2+...+n//const log = console.log.bind(console);

const log = _ =>functionsumOneToN(n)

let sum= 0;for (let i = 1; i <= n; i++)

sum+=i;

log(`i=$i: sum=$sum`);

returnsum;



sumOneToN(10);

位运算的一些小技巧

判断一个整数 x 的奇偶性: x & 1 = 1 (奇数) , x & 1 = 0 (偶数)

求一个浮点数 x 的整数部分: ~~x ,对于正数相当于 floor(x) 对于负数相当于 ceil(-x)

计算 2 ^ n : 1 << n 相当于 pow(2, n)

计算一个数 x 除以 2 的 n 倍: x >> n 相当于 ~~(x / pow(2, n))

判断一个数 x 是 2 的整数幂(即 x = 2 ^ n ): x & (x - 1) = 0

※注意※:上面的位运算只对32位带符号的整数有效,如果使用的话,一定要注意数!据!范!围!

记住这些技巧的作用:

提升运行速度 ❌

提升逼格 ✅

举一个实用的例子,快速幂(原理自行google)

//计算x^n n为整数

functionqPow(x, n)

let result= 1;while(n) if (n & 1) result *= x; //同 if(n%2)

x = x *x;

n>>= 1; //同 n=floor(n/2)

returnresult;



链表

刚开始做 LeetCode 的题就遇到了很多链表的题。恶心心。最麻烦的不是写题,是调试啊!!于是总结了一些链表的辅助函数。

/**

* 链表节点

* @param * val

* @param ListNode next*/

function ListNode(val, next = null) this.val =val;this.next =next;

/**

* 将一个数组转为链表

* @param array a

* @return ListNode*/const getListFromArray= (a) =>

let dummy= newListNode()

let pre=dummy;

a.forEach(x=> pre = pre.next = newListNode(x));returndummy.next;

/**

* 将一个链表转为数组

* @param ListNode node

* @return array*/const getArrayFromList= (node) =>

let a=[];while(node)

a.push(node.val);

node=node.next;

returna;

/**

* 打印一个链表

* @param ListNode node*/const logList= (node) =>

let str= 'list: ';while(node)

str+= node.val + '->';

node=node.next;



str+= 'end';

log(str);



还有一个常用小技巧,每次写链表的操作,都要注意判断表头,如果创建一个空表头来进行操作会方便很多。

let dummy = newListNode();//返回

return dummy.next;

使用起来超爽哒~举个例子。@leetcode 82。题意就是删除链表中连续相同值的节点。

/** @lc app=leetcode id=82 lang=javascript

*

* [82] Remove Duplicates from Sorted List II*/

/**

* @param ListNode head

* @return ListNode*/

var deleteDuplicates = function(head) //空指针或者只有一个节点不需要处理

if (head === null || head.next === null) returnhead;

let dummy= newListNode();

let oldLinkCurrent=head;

let newLinkCurrent=dummy;while(oldLinkCurrent)

let next=oldLinkCurrent.next;//如果当前节点和下一个节点的值相同 就要一直向前直到出现不同的值

if (next && oldLinkCurrent.val ===next.val) while (next && oldLinkCurrent.val ===next.val)

next=next.next;



oldLinkCurrent=next;

else

newLinkCurrent= newLinkCurrent.next =oldLinkCurrent;

oldLinkCurrent=oldLinkCurrent.next;





newLinkCurrent.next= null; //记得结尾置空~

logList(dummy.next);returndummy.next;

;

deleteDuplicates(getListFromArray([1,2,3,3,4,4,5]));

deleteDuplicates(getListFromArray([1,1,2,2,3,3,4,4,5]));

deleteDuplicates(getListFromArray([1,1]));

deleteDuplicates(getListFromArray([1,2,2,3,3]));

本地运行结果

list: 1->2->5->end

list:5->end

list: end

list:1->end

是不是很方便!

矩阵(二维数组)

矩阵的题目也有很多,基本每一个需要用到二维数组的题,都涉及到初始化,求行数列数,遍历的代码。于是简单提取出来几个函数。

/**

* 初始化一个二维数组

* @param number r 行数

* @param number c 列数

* @param * init 初始值*/const initMatrix= (r, c, init = 0) => new Array(r).fill().map(_ => newArray(c).fill(init));/**

* 获取一个二维数组的行数和列数

* @param any[][] matrix

* @return [row, col]*/const getMatrixRowAndCol= (matrix) => matrix.length === 0 ? [0, 0] : [matrix.length, matrix[0].length];/**

* 遍历一个二维数组

* @param any[][] matrix

* @param Function func*/const matrixFor= (matrix, func) =>

matrix.forEach((row, i)=>

row.forEach((item, j)=>

func(item, i, j, row, matrix);

);

)

/**

* 获取矩阵第index个元素 从0开始

* @param any[][] matrix

* @param number index*/

functiongetMatrix(matrix, index)

let col= matrix[0].length;

let i= ~~(index /col);

let j= index - i *col;returnmatrix[i][j];

/**

* 设置矩阵第index个元素 从0开始

* @param any[][] matrix

* @param number index*/

functionsetMatrix(matrix, index, value)

let col= matrix[0].length;

let i= ~~(index /col);

let j= index - i *col;return matrix[i][j] =value;



找一个简单的矩阵的题示范一下用法。@leetcode 566。题意就是将一个矩阵重新排列为r行c列。

/** @lc app=leetcode id=566 lang=javascript

*

* [566] Reshape the Matrix*/

/**

* @param number[][] nums

* @param number r

* @param number c

* @return number[][]*/

var matrixReshape = function(nums, r, c) //将一个矩阵重新排列为r行c列

//首先获取原来的行数和列数

let [r1, c1] =getMatrixRowAndCol(nums);

log(r1, c1);//不合法的话就返回原矩阵

if (!r1 || r1 * c1 !== r * c) returnnums;//初始化新矩阵

let matrix =initMatrix(r, c);//遍历原矩阵生成新矩阵

matrixFor(nums, (val, i, j) =>

let index= i * c1 + j; //计算是第几个元素

log(index);

setMatrix(matrix, index, val);//在新矩阵的对应位置赋值

);returnmatrix;

;

let x= matrixReshape([[1],[2],[3],[4]], 2, 2);

log(x)

二叉树

当我做到二叉树相关的题目,我发现,我错怪链表了,呜呜呜这个更恶心。

当然对于二叉树,只要你掌握先序遍历,后序遍历,中序遍历,层序遍历,递归以及非递归版,先序中序求二叉树,先序后序求二叉树,基本就能AC大部分二叉树的题目了(我瞎说的)。

二叉树的题目 input 一般都是层序遍历的数组,所以写了层序遍历数组和二叉树的转换,方便调试。

function TreeNode(val, left = null, right = null) this.val =val;this.left =left;this.right =right;

/**

* 通过一个层次遍历的数组生成一棵二叉树

* @param any[] array

* @return TreeNode*/

functiongetTreeFromLayerOrderArray(array)

let n=array.length;if (!n) return null;

let index= 0;

let root= new TreeNode(array[index++]);

let queue=[root];while(index

let top=queue.shift();

let v= array[index++];

top.left= v == null ? null : newTreeNode(v);if (index

let v= array[index++];

top.right= v == null ? null : newTreeNode(v);

if(top.left) queue.push(top.left);if(top.right) queue.push(top.right);

returnroot;

/**

* 层序遍历一棵二叉树 生成一个数组

* @param TreeNode root

* @return any[]*/

functiongetLayerOrderArrayFromTree(root)

let res=[];

let que=[root];while(que.length)

let len=que.length;for (let i = 0; i < len; i++)

let cur=que.shift();if(cur)

res.push(cur.val);

que.push(cur.left, cur.right);

else

res.push(null);





while (res.length > 1 && res[res.length - 1] == null) res.pop(); //删掉结尾的 null

returnres;



一个例子,@leetcode 110,判断一棵二叉树是不是平衡二叉树。

/**

* @param TreeNode root

* @return boolean*/

var isBalanced = function(root) if (!root) return true; //认为空指针也是平衡树吧

//获取一个二叉树的深度

const d = (root) =>if (!root) return 0;return _max(d(root.left), d(root.right)) + 1;



let leftDepth=d(root.left);

let rightDepth=d(root.right);//深度差不超过 1 且子树都是平衡树

if (_min(leftDepth, rightDepth) + 1 >=_max(leftDepth, rightDepth)&& isBalanced(root.left) && isBalanced(root.right)) return true;return false;

;

log(isBalanced(getTreeFromLayerOrderArray([3,9,20,null,null,15,7])));

log(isBalanced(getTreeFromLayerOrderArray([1,2,2,3,3,null,null,4,4])));

二分查找

参考 C++ STL 中的 lower_bound 和 upper_bound 。这两个函数真的很好用的!

/**

* 寻找>=target的最小下标

* @param number[] nums

* @param number target

* @return number*/

functionlower_bound(nums, target)

let first= 0;

let len=nums.length;while (len > 0)

let half= len >> 1;

let middle= first +half;if (nums[middle]

first= middle + 1;

len= len - half - 1;

else

len=half;



returnfirst;

/**

* 寻找>target的最小下标

* @param number[] nums

* @param number target

* @return number*/

functionupper_bound(nums, target)

let first= 0;

let len=nums.length;while (len > 0)

let half= len >> 1;

let middle= first +half;if (nums[middle] >target)

len=half;

else

first= middle + 1;

len= len - half - 1;



returnfirst;



照例,举个例子,@leetcode 34。题意是给一个排好序的数组和一个目标数字,求数组中等于目标数字的元素最小下标和最大下标。不存在就返回 -1。

/** @lc app=leetcode id=34 lang=javascript

*

* [34] Find First and Last Position of Element in Sorted Array*/

/**

* @param number[] nums

* @param number target

* @return number[]*/

var searchRange = function(nums, target)

let lower=lower_bound(nums, target);

let upper=upper_bound(nums, target);

let size=nums.length;//不存在返回 [-1, -1]

if (lower >= size || nums[lower] !== target) return [-1, -1];return [lower, upper - 1];

;

在 VS Code 中刷 LeetCode

前面说的那些模板,难道每一次打开新的一道题都要复制一遍么?当然不用啦。

首先配置代码片段 选择 Code -> Preferences -> User Snippets ,然后选择 JavaScript

然后把文件替换为下面的代码:

"leetcode template": "prefix": "@lc","body": ["const _max = Math.max.bind(Math);","const _min = Math.min.bind(Math);","const _pow = Math.pow.bind(Math);","const _floor = Math.floor.bind(Math);","const _round = Math.round.bind(Math);","const _ceil = Math.ceil.bind(Math);","const log = console.log.bind(console);","// const log = _ => ","/**************** 链表 ****************/","/**"," * 链表节点"," * @param * val"," * @param ListNode next"," */","function ListNode(val, next = null) "," this.val = val;"," this.next = next;","","/**"," * 将一个数组转为链表"," * @param array array"," * @return ListNode"," */","const getListFromArray = (array) => "," let dummy = new ListNode()"," let pre = dummy;"," array.forEach(x => pre = pre.next = new ListNode(x));"," return dummy.next;","","/**"," * 将一个链表转为数组"," * @param ListNode list"," * @return array"," */","const getArrayFromList = (list) => "," let a = [];"," while (list) "," a.push(list.val);"," list = list.next;"," "," return a;","","/**"," * 打印一个链表"," * @param ListNode list "," */","const logList = (list) => "," let str = 'list: ';"," while (list) "," str += list.val + '->';"," list = list.next;"," "," str += 'end';"," log(str);","","/**************** 矩阵(二维数组) ****************/","/**"," * 初始化一个二维数组"," * @param number r 行数"," * @param number c 列数"," * @param * init 初始值"," */","const initMatrix = (r, c, init = 0) => new Array(r).fill().map(_ => new Array(c).fill(init));","/**"," * 获取一个二维数组的行数和列数"," * @param any[][] matrix"," * @return [row, col]"," */","const getMatrixRowAndCol = (matrix) => matrix.length === 0 ? [0, 0] : [matrix.length, matrix[0].length];","/**"," * 遍历一个二维数组"," * @param any[][] matrix "," * @param Function func "," */","const matrixFor = (matrix, func) => "," matrix.forEach((row, i) => "," row.forEach((item, j) => "," func(item, i, j, row, matrix);"," );"," )","","/**"," * 获取矩阵第index个元素 从0开始"," * @param any[][] matrix "," * @param number index "," */","function getMatrix(matrix, index) "," let col = matrix[0].length;"," let i = ~~(index / col);"," let j = index - i * col;"," return matrix[i][j];","","/**"," * 设置矩阵第index个元素 从0开始"," * @param any[][] matrix "," * @param number index "," */","function setMatrix(matrix, index, value) "," let col = matrix[0].length;"," let i = ~~(index / col);"," let j = index - i * col;"," return matrix[i][j] = value;","","/**************** 二叉树 ****************/","/**"," * 二叉树节点"," * @param * val"," * @param TreeNode left"," * @param TreeNode right"," */","function TreeNode(val, left = null, right = null) "," this.val = val;"," this.left = left;"," this.right = right;","","/**"," * 通过一个层次遍历的数组生成一棵二叉树"," * @param any[] array"," * @return TreeNode"," */","function getTreeFromLayerOrderArray(array) "," let n = array.length;"," if (!n) return null;"," let index = 0;"," let root = new TreeNode(array[index++]);"," let queue = [root];"," while(index < n) "," let top = queue.shift();"," let v = array[index++];"," top.left = v == null ? null : new TreeNode(v);"," if (index < n) "," let v = array[index++];"," top.right = v == null ? null : new TreeNode(v);"," "," if (top.left) queue.push(top.left);"," if (top.right) queue.push(top.right);"," "," return root;","","/**"," * 层序遍历一棵二叉树 生成一个数组"," * @param TreeNode root "," * @return any[]"," */","function getLayerOrderArrayFromTree(root) "," let res = [];"," let que = [root];"," while (que.length) "," let len = que.length;"," for (let i = 0; i < len; i++) "," let cur = que.shift();"," if (cur) "," res.push(cur.val);"," que.push(cur.left, cur.right);"," else "," res.push(null);"," "," "," "," while (res.length > 1 && res[res.length - 1] == null) res.pop(); // 删掉结尾的 null"," return res;","","/**************** 二分查找 ****************/","/**"," * 寻找>=target的最小下标"," * @param number[] nums"," * @param number target"," * @return number"," */","function lower_bound(nums, target) "," let first = 0;"," let len = nums.length;",""," while (len > 0) "," let half = len >> 1;"," let middle = first + half;"," if (nums[middle] < target) "," first = middle + 1;"," len = len - half - 1;"," else "," len = half;"," "," "," return first;","","","/**"," * 寻找>target的最小下标"," * @param number[] nums"," * @param number target"," * @return number"," */","function upper_bound(nums, target) "," let first = 0;"," let len = nums.length;",""," while (len > 0) "," let half = len >> 1;"," let middle = first + half;"," if (nums[middle] > target) "," len = half;"," else "," first = middle + 1;"," len = len - half - 1;"," "," "," return first;","","$1"],"description": "LeetCode常用代码模板"

参考技术A 可以。
因为前端工程师一般都要掌握多门语言,原因就在于在写代码时不一定要局限于某一种程序语言。Java程序也是可以写前端代码的,区别也仅仅是在于不同的程序语言各有特色罢了。
参考技术B Copyright © 1999-2020, CSDN.NET, All Rights Reserved

搜索博文/帖子/用户
打开APP

你在红楼 我在西游
关注
java开发做力扣,使用VS Code 来编写提交调试LeetCode或者力扣的代码(Java版本) 转载
2021-03-10 07:27:05

你在红楼 我在西游

码龄4年

关注
这里描述使用VS code 中的java的来调试,提交LeetCode或者力扣的代码。

主要是Code来调试,能够更轻量级,没有intellij 或者eclipse这里那么繁重。

总体三个步骤;

1,安装VS Code

2, 一键安装java 的开发环境

3,安装leetCode 插件和Debuger for java 插件

# 安装VS Code

安装最新版的VS Code 来,下载地址:https://code.visualstudio.com/

b78850f3d2ebf3c76df7802645571981.png

# 一键安装VS Code的Java开发环境

微软发布了一键安装的程序,下载链接参见这里:https://download.csdn.net/download/fruitful1989/11243489

或者从这里下载https://link.zhihu.com/?target=http%3A//aka.ms/vscode-java-installer-win

或者参见这篇知乎里面的下载地址:https://zhuanlan.zhihu.com/p/69225310

自己根据自己的选择安装即可

# 安装LeetCode 插件

在Vs Code 的扩展里面搜索leetCode

096e09202df7d75386c288af1ebfe7e7.png

f7347a9bc29f0a69444d3315dbc94a5a.png

之后安装debugger for java 插件:

dbcb78008b8e8103bdc6c04fc870797b.png

最终的效果如下图所示:

e97e8acf8cb97300953cbff3b4111a18.png

F10 单步调试

相关资源:Leetcode:力扣个人代码C++_力扣提交代码格式,力扣代码格式-其它...
文章知识点与官方知识档案匹配
算法技能树首页概览
30785 人正在系统学习中
参考技术C 这里描述使用VS code 中的java的来调试,提交LeetCode或者力扣的代码。

主要是Code来调试,能够更轻量级,没有intellij 或者eclipse这里那么繁重。

总体三个步骤;

1,安装VS Code

2, 一键安装java 的开发环境

3,安装leetCode 插件和Debuger for java 插件

力扣66(java)-加一(简单)

题目: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:digits = [1,2,3]输出:[1,2,4]解释:输入数组表示数字 123

以上是关于前端可以用java写力扣吗的主要内容,如果未能解决你的问题,请参考以下文章

一般刷java题都是上力扣吗?

javaleetcode690.员工的重要性

建设银行房贷没扣成功会补扣吗?

建设银行房贷没扣成功会补扣吗?

精选力扣500题 第59题 LeetCode 93. 复原 IP 地址c++/java详细题解

7.整数反转Java版,每日一题系列(此题来自力扣网)