最近在LeetCode上做了一些算法题,大部分是最基础easy难度的题。做完之后很多算法需要重构才可以通过所有的cases,在这个过程中我发现有效提高了基础语言能力,比单纯写项目提高的更快,希望不知道如何提高语言能力的小伙伴可以去上面刷几道题。
下图是这一周刷的题,每天上班空隙刷一道,不贪多。
下面介绍其中一道题:
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
翻译就是给你一个整形数组,除了某一个元素外,其他元素都会出现两次,找到那个只出现一次的元素。
首先想到使用遍历+计数器的方法,大意是使用两个for循环遍历比对数组,如果每次循环结果计数器不等于2而是等于1,那么就返回那个数字
var singleNumber = function(nums) {
let count = 0
for(let i=0;i<=nums.length-1;i++){
for(let m=0;m<=nums.length-1;m++){
if(nums[i]===nums[m]){
count++
}
}
if(count===1){
return nums[i]
}
count = 0;
}
}
这段代码在桌面编译器是可以执行得到正确结果的,但是在leetCode上显示:
程序运行超时,这就是leetCode比较有意思的地方了,你的代码时间复杂度和空间复杂度太高是不可以通过的,这就逼迫我一直重构重构。。。
于是就有了下面这个方案:
var singleNumber = function(nums) {
//查询数组之中不重复的那个元素,使用排序法,使用一个循环来遍历数组
//排序后的数学特征是:如果每次步幅为2的话,当遇到两个不相等的数字时,那么第一个数字就是那个不重复的数
//而且不需要考虑数组角标越界
nums.sort(compare)
let i =0;
while(nums[i]===nums[i+1]){
i=i+2
}
return nums[i]
};
function compare(a,b){
return a-b
}
只是用了1个循环,排序后利用题目的数学特征去判断,一对儿一对儿判断。
例如:
[1,1,2,2,3,4,4]
第一对相等,i=i+2之后判断 第二对相等 同理判断第三对不等,那么答案就是nums[i]
提交后:
提交成功。不过这只是其中一道比较简单的题,还有大量medium和hard题目前刷起来比较费时,有的则根本没有思路,但是我相信以后我会全刷完的。
目前leetCode上面有679道题,还在递增,内容涉及各类算法,数据结构,数据库,网络等,确实是一个练手的宝库。