leetcode算法题(JavaScript实现)
题外话
刷了一段时间的codewars的JavaScript题目之后,它给我最大的感受就是,会帮助你迅速的提升你希望练习的语言的API的熟悉程度,Array对象、String对象等原生方法,构造函数、一些算法题等。每次submit之后,看看自己的代码,再看看别人写的代码。发现自己写的代码和实现实现思路简直弱爆了。于是,每次都会在submi完之后,会看看Top five的答案,理解大牛们的解题思路(大多数情况下,代码会使用ES6的语法,非常简洁),然后train again。按照这种方法,练习了将近20来天的时间。这是我在codewars上的成果,5kyu,刷了93题,有一些题目实在想不到,就unlock solutions了。因此Honor Completed Kata并不是100%。

最近开始玩leetcode了,换个plaform主要是因为leetcode上的题目大多都是各大互联网公司的面试题目,而且大多偏向算法。恰巧我最近迫切的想要提高这方面的能力。于是转移了plaform,虽然我有些不舍:"( 。但是我还是会持续玩codewars的/
1-20 leetcode个人解题思路

实现思路:创建一个空数组,写两层循环。第二层循环的变量初始化是基于第一次循环的。接着做判断,如果nums[i] + nums[j] === target,就退出循环。
//旧思路,由于网友的提出,该算法的时间复杂度为O(n^2)
    var twoSum = function(nums, target) {
	let index = [];
	for (let i = 0; i < nums.length; i++) {
		for (let j = i + 1; j < nums.length; j++) {
			if (nums[i] + nums[j] === target) {
				index.push(i);
				index.push(j);
				break;
		}
	}
}
	return index;
};
    //新思路:
    var twoSum = function(nums, target) {
        let arr = [],
    obj = {},
    len = nums.length;
    for (let i = 0; i < len; i++) {
        if (obj[target - nums[i]] !== undefined) {
            arr[0] = obj[target - nums[i]];
	    arr[1] = i;
	    return arr;
	}
	obj[nums[i]] = i;
    }
    };
ZigZag Conversion(Difficulty: Easy; Tags: String)

首先,要想完成这道题目,需要明白的是。ZigZag pattern与给定的行数有什么关系。
很简单,只有2行、3行、4行时zigzag的形状分别如下

这个题目主要的思路是明白给定的行数与每行中需要提取的字母位置之间的关系。
- 当只有一行时,直接返回原字符串
 - 当大于一行时,第一行和最后一行的规律相同,即(假定指定行数是n,此时n>1)每个圆圈(代码一个值)都是每隔[ n - (n - 2) ] * (n - 1)个位置出现一次
 - 除了第一行和最后一行,中间行数圆圈的分布也有规律:画蓝色箭头的后一个值与前一个值相差 2 * (n - 1)个位置,画绿色箭头的两个值也遵循这个规律。因此,实现代码如下
 

var convert = function(s, numRows) {
	if (numRows === 1) return s;
	let str = '';
	let num = (numRows - (numRows - 2)) * (numRows - 1);	//2
	for (let i = 1; i <= numRows; i++) {
		for (let j = i - 1; j < s.length; j += num) {
			if (i === 1 || i === numRows) {
				str += s.slice(j, j + 1);
			} else {
				str += s.slice(j, j + 1);
				str += s.slice(j + num - (2 * (i - 1)), j + num - (2 * (i - 1)) + 	1);
			}
		}
	}
	return str;
};
console.log(convert("123456789", 2));				//135792468
console.log(convert("123456789", 3));				//159246837
console.log(convert("123456789", 4));				//172683594
console.log(convert("1234567891234567891234", 5));	//1982817937261463524543

这道题目挺有意思,题目很直接,让我们将input的指reverse。但是有要求,就是当reverse的值如果超过32bit,就要返回0。
思路是使用JS的或运算|,即位运算符,将reverse的值转换成32位,然后再与原值作比较。
Math.pow(2, 32)|0  返回0 (Math.pow(2, 32) + 1)|0 返回1。因此解题逻辑为
var reverse = function(x) {
	let str1 = x.toString().match(/[0-9]/g).reverse().join('');
	let str2 = x.toString().match(/[^0-9]/g) === null ? '' : x.toString().match(	/[^0-9]/g).join('');
	let num1 = Number(str2 + str1)|0;	//reverse and transform to 32bit
	let num2 = Number(str2 + str1);
	return num1 === num2 ? num2 : 0;
};

这个题目,主要考察对数据类型NaN的理解和对方法isNaN()的理解,同时考察对Number、parseInt、parseFloat方法的区别。这里简单的声明一下。
NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数
未返回数值的情况(这样就不会抛出错误了)。任何数值除以0会返回NaN。
NaN与任何值都不相等,包括NaN本身。因此console.log(NaN === NaN)   // false
isNaN是用来判断参数是否“不是数值”。
parseInt
parseInt和parseFloat用于将字符串转换为数值类型,而Number用于转换任何数据类型,这里主要介绍一下parseInt。
parseInt会忽略字符串前面的空格,直至找到一个非空格字符。如果第一个字符不是数字字符或者负号或者正号,parseInt会返回NaN。也就是说,用parseInt()转换空字符串会返回NaN(Number()对空字符返回0)如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如,"1234blue"会被转换为1234,因为"blue"会被完全忽略。类似地,"22.5"会被转换为22,因为小数点并不是有效的数字字符;'-123'会被转换为-123,因为第一个字符是负号,而后面的字符都是数字;'-+123'会返回NaN,因为第一个字符是-,而第二个字符却是+,不符合正常的数值模式。
因此,此题的解题思路如下:
var myAtoi = function(str) {
	let symbol = '';
	str = str.replace(/^\s+|\s+$/g, '');//去除两端空格
	str = isNaN(parseInt(str)) ? 0 : parseInt(str);
	if (str > Math.pow(2, 31) - 1) {
		return Math.pow(2, 31) - 1;
	} else if (str < - Math.pow(2, 31)) {
		return - Math.pow(2, 31);
	} else {
		return str;
	}
};
持续更新中...
leetcode算法题(JavaScript实现)的更多相关文章
- 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]范围内,计算每个整数的 ...
 
随机推荐
- Go语言及Web框架Beego环境
			
Go语言及Web框架Beego环境无脑搭建 [原]Go语言及Web框架Beego环境无脑搭建 本文涉及软件均以截至到2013年10月12日的最新版本为准 1. 相关软件准备: 1) go1.2rc1. ...
 - 我使用的Chrome插件列表
			
AdBlock 用来屏蔽广告的,有一些网站会探测出你在使用AdBlock.如果一定要继续浏览的话,你可能需要暂停一下AdBlock Vimium 非常推荐喜欢vim的用户试试看这款插件,它的主要特色是 ...
 - Android -- 贝塞尔实现水波纹动画(划重点!!)
			
1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一 ...
 - Angular2.js——数据显示
			
显示数据,即属性绑定机制把数据显示到用户界面上. 在Angular中最典型的数据显示方式,就是把HTML模板中的控件绑定到Angular组件的属性. 接下来介绍几种数据显示的语法和代码片段. 使用插值 ...
 - python 错误之SyntaxError: Missing parentheses in call to 'print'
			
SyntaxError: Missing parentheses in call to 'print' 由于python的版本差异,造成的错误. python2: print "hello ...
 - 浅谈移动端rem的用法
			
一 什么是rem? “font size of the root element 这是w3c的定义 也就是说是相对于根节点(html节点)的字体大小的单位. 目前主流的浏览器基本都支持rem这个单位, ...
 - 使用font-size:0去掉inline-block元素之间的空隙
			
现代浏览器的最新版都支持inline-block,只有该死的ie6.7不支持inline-block,但ie6.7可以通过 display:inline: zoom:1: 来模拟 下面是inline- ...
 - [UWP]了解模板化控件(9):UI指南
			
1. 使用TemplateSettings统一外观 TemplateSettings提供一组只读属性,用于在新建ControlTemplate时使用这些约定的属性. 譬如,修改HeaderedCont ...
 - luogu P1007 独木桥
			
序:难度标签是普及-,便觉得应该非常简单,结果发现有一个弯半天没绕过来,所以认为这道题对于第一次做的人来讲还是很是比较有意义的. 题目描述: 长度为len的桥上有n个士兵,你不知道他们的初始方向.已知 ...
 - Python变量运算字符串等
			
一,作用域 操作 name = 'liuyueming' if 1==1:... print name... liuyueming 两次回车执行 修改代码 >>> if 1==1:. ...