每周一道算法题……已经没脸说了…

感谢

首先感谢我的读者大人们给我的支持,周二推送的有趣的心理测试,引发的一系列故事……,不到24小时,有10个人给了我「赞赏」支持,11个人点了「在看」给我鼓励,在我现在公众号关注量才38个人,并且还没有留言功能与你们更便捷的互动的前提下,这简直是我想都不敢想的事情。

非常感谢各位读者大人给我的支持与鼓励,让我更能沉下心来,用心的写原创,给你们带来有价值的文字与更好的阅读体验

先聊聊为什么用Go语言写算法题

上周咱们做的那个长整数求和的算法题,有几个人跟我反馈说看不懂,仔细一问哪里看不懂,结果都是告诉我是语法看不懂……

其实我用Go语言写,也是希望你们能学一学Go语言,因为关注我的读者大人们,大多数都是前端工程师,而前端工程师的看家本领就是JavaScript,就算是接触过后端,后端语言也是主要用Node.js

而现在各大企业对前端工程师的要求也是越来越高,从去年的招聘来看,会Node.js或者Python的前端工程师,是有很大的优势的

现在再来看招聘信息,大多数企业认为前端工程师必须学会Node.js,Node.js已经成为了标配,而同等条件下拥有优先录取权的却是Python与Go会其一

所以大家就算是为了自己的薪资奋斗,也还是好好学学Go吧~~

有时间我再写篇文章,怎么快速入门Go语言,至少我用Go去实现算法题时,你们也都能看懂了(突然发现到现在已经欠了好多文了……)

所谓债多不压身……我现在就是死猪不怕开水烫,你们不催我,我就慢慢来了……

既然还没写,那咱们今天就写个简单算法,用Go语言实现,先对Go的语法有一个模糊的认识

数组的操作

先从最简单的数组开始

这是LeetCode题号为027的题,篇幅有限,我就不把英语说明给弄上来了,我就简单说下这道题要我们做什么

意思就是「给定一个数组,返回去除指定数字后的数组长度。要求:不允许存在额外的数组空间,空间复杂度为0(1)」

示例1:

给一个数组:nums = [3,2,2,3], 再给一个值val = 3
函数应返回length = 2,并且nums数组的前两个元素为2,2

示例2:

给一个数组:nums = [0,1,2,2,3,0,4,2], 再给一个值val = 2
函数应返回length = 5,并且nums数组的前五个元素为0,1,3,0,4

看完给的example应该就明白了,它不仅是要我们返回一个去除数组内指定数字后的数组长度,还要数组在这个长度内的数组元素不能包含给定的值

这道题虽然简单,但也是有点意思的,有意思的地方是不能额外再定义一个数组空间,这点要求加大了一丢丢难度

先说说思路

我们需要把数组内,与给定值相匹配的元素移除就好了,但是Go语言并没有数组的元素直接删除方法,但JavaScript有,后面会写到

再又因为不能使用额外的数组,所以只能在传进来的数组内进行数组元素的位置交换操作

所以我们定义一个游标ij,游标i用于遍历数组,游标j用于记录数组位置

咱们利用游标j,重新把数组内的所有元素给刷新一遍

再看看实现

func removeElement(nums []int, val int) int {
// var j= 0
	j := 0
//循环遍历数组,i为数组索引值,v为数组索引对应的值
	for i, v := range nums {
		if v != val {
			nums[j] = nums[i]
			j++
		}
	}
	return j
}

比如上面的示例,nums = [0,1,2,2,3,0,4,2],ij都是从0开始,j的作用有2个,第一是用于计算数组除了给定值val外的数组长度,第二个作用就是数组在这个长度之内的,没有与给定值val相匹配的元素

当遇见与val先匹配的元素时,i+1,而j却保持不动,直到遇到与val不匹配的元素,将后面的元素挪到前面来就好了。

反正咱们不需要管数组的完整性,所以nums[j]这个在前面的元素,并不需要与后面的元素做交换。

Go的语法与Javascript的区别

好了,题目很简单,咱们来看看Go语言的语法与JavaScript有什么不一样的地方

首先是变量的定义,咱们在JavaScript中都是使用letconst或者var来定义一个变量

在Go语言中定义变量的方式有两种,第一中是var a int,这是定义一个int类型的变量,像上面code写的那样j:=0,其实就是下面Code的缩写,:=会自动推断数据类型并赋值

var j int // 定义变量 j 
j = 0 // 给变量 j 赋值

其次就是遍历数组了,JavaScript中的forforeachwhile什么的循环语句没有了,在Go语言中,循环语句只有for,对数组的遍历有一个range

不要range也可以,可以把上面循环语句的改写成for i:=0,i<len(nums),i++ { },注意,是没有()

再接着就是数组的操作了,像在Go语言中,数组是没有直接删除一个元素的操作的,所以上面的解决方案我是把后面的元素给移到前面来了

而JavaScript不一样,数组有splice方法,可以直接对数组进行元素移除操作,这样子这道题就太简单了…送分题啊~~!!

最后再用JavaScript实现一次,更贴心的感受一下Go与JavaScript的不同吧

let removeElement = function(nums, val) {
    let j=0;
    for(i=0; i<nums.length; i++){
        if(nums[i] != val) {
            nums[j]=nums[i];
            j++;
        }
    }
};

不过像上面这样,把JavaScript像Go语言那样去实现,LeetCode不给通过,我觉得可能这道题就是有问题……

毕竟这样实现JavaScript与Go得出的结果是一样的,但偏偏Go就给过了~这是对Go的偏爱???还是因为他知道Go里面没办法做数组删除操作,就只能这样给过了?

如果你想提交到LeetCode,我也用Javascript实现了可以提交通过的Code,如下:

let removeElement = function(nums, val) {
    for(i=0; i<nums.length; i++){
        if(nums[i] == val) {
            nums.splice(i,1);
            i--;
        }
    }
};

再一次感受到了绝望

LeetCode提交后,用Go实现与用Javascript实现的差距……

不管是运行时间,还是内存占用,Go都是完全碾压JavaScript……嗯……JavaScript这个性能,真是让人感到开心啊

毕竟调式大型项目时,编译时间可以去喝一杯咖啡了~嘻嘻(开个玩笑,没这么夸张)

同样都是支持高并发的Node.js与Go,Go还可以利用多线程的优势,充分利用CPU的性能,这点可能也是各大企业喜欢Go的一点原因吧

为了让你们学习Go语言,这周的算法题本来是想循序渐进给你们说三个类似的算法题的,现在倒成了宣传Go语言了……可宣传也没宣传到位啊-,-唉,没脸说了,变成一个娱乐号主了……

如果对Go语言感兴趣,我这周给你们找些好的资料书与你们分享学习,点个「在看」让我知道一下吧~

相关推荐:

你可能连整数求和都不会……

扫码关注微信公众号「闹闹吃鱼」,每周都有好分享

发布了40 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/AdolphKevin/article/details/88866319
今日推荐