00:00
大家好。欢迎大家继续收看上硅谷的Linux运维课程,我是沈超老师。这节课我们继续来看经典面试题,少儿编程类的这个部分我们来看第二题。随机字符串。那我们先看看题啊,这里说。循环使用循环在根目录下的艾硅谷目录下创建十个TXT文件,要求文件名有六个随机数加固定字串,比如说下划线这这组成也就说。而变成这样的一个文件,那我们说啊,各位。呃,其实这是一个典型的算法题。考验编程思想这样一种算法题。那我们说实话。其实这不是事儿的特点啊。至少在我看来是这样。12的特征,它其实是为了干嘛,是为了这个简化,或者说这个提升管理员的这种管理系统的效率。或者简化你的工作难度、工作强度。
01:01
我可能有些工作需要重复执行,天天都要做,那我手工做是不是很很很很累啊?所以呢,我写个脚本,通过定时任务让他每天自动执行就可以了,这是事儿的主要功能。当然,我说上11门完整的语言。像这样类的这种算法题,其实事儿能实现,但是。它实践起来可能跟其他的语言不太一样,它需要调用,或者啊,或者说他的实验方法可能就很别扭,它不像这个其他语言,它。它最大的这个特征啊,和其他语言比,其他语言是有完善的函数的,就各种功能人家都提前写好了,你直接要用,把函数找着调用就可以用。而我们善人呢,他主要是来做这种简化重复操作,根本不是用它来写什么大型项目啊,大型访问啊,写这样的这种什么各种的这种底层算法都是干这事的。所以Sha本身也没有给我们准备各种系统函数没有了Sha是没有了,函数很少,它里面能实现的函数很少,大多数都没有。
02:05
所以沙尔其实就根本其实就不是用来写这种东西的东西。但是面试题这个事儿就团结在这儿。只要有人出了这么个题。哎,放到网上大家看见了,反正就你以后再碰到的几率就比较大。所以我们说,呃,既然有,那我们还是要想办法解决这个题,为什么拿出来讲一下,其实问的很多正常的题,比如说像我们上课上,我们录视频的时候,我们讲了很多系统管理的这种脚本。啊,比如说批量重启啊,啊,什么批量添加用户啊,检测什么这个这个非法文件啊等等这样的脚本,其实这些才是事儿应该干的事儿。哎,判断这个服务有没有这个启动啊,判断这个什么CPU内存是否超标啊等等这些是。而像这样的纯算法器。其实对沙尔来讲,其实并不擅长。那为什么拿出来讲?原因很简单,我们虽然出去这个面试碰到这样的题。
03:04
他也不会,那怎么办?那我们就讲一下,以后再碰到了那。虽然说如果我作为面试官,我不会出这。但是这事儿就是这样,我不出别人会出,我又不我也招聘,但是我招不了多少人啊,我们学员出去还是要面试啊,那有就要解决问题,那我们就讲这样一个纯算法题,OK,好。那这是一个考验的语法了,这个生产方法,这个是算法题啊,变成思想类的好。那还是这句话,编程思想类的,它就会有各种各样的解决方法,我挑了一个容易记得或者说相对简单的方法来讲解,好,我们看看啊。那。讲一下我们系统中有两个特殊设备文件,第一类下的两个特殊设备文件,一个叫做这个random,一个叫on,小心啊,这是俩特殊设备文件,这不是系统的函数,也不是变量。那这两个东西,它的作用就是生成随机字串。
04:01
可以用来生成随机字符串。区别在于俩都能生成啊,区别在于上面这个是利用系统中断生成的,它的随机性更好。但是他占用系统资源。下面这个生成的数据速度快,但是随机性不足,但是呢不太耗费系统资源,我们推荐用这种。当然用上面那个也行,其实就是俩系统,就跟我们下的Z这个玩意儿一样,是一个特殊系统的硬件设备文件。它的作用是不是产生二进制零啊,上面这个呢,就是产生随机数诶。系统准备了这样一个东西,我们得利用它来生成,当然我们还有其他的方法,比如说利用MD5。加密,我们都知道同样的字符串,MD加完之后,它的那个字符串是随机的那个也行啊。呃,反正我其实就是说。其实要是其他语言它有函数的,或者你直接写个数组直接往外蹦就行了,对吧,写个数组随机往外跳就行了,因为数组只有函数的,而我们事里面连数组函数都没有,数组有没有数字函数?
05:06
所有的功能都得自己写,所以我就说事儿,他根本就不是干这个事儿的啊。是有吧,我们就看看,我们不能利用函数数组来完成,我们得利用特殊设备文件或者MD5加密这样的思路来完成,因为我们系统当中上中没有这种随机跳随随机的这种生成函数,好了。那。要想写这个程序,我们有一些必备的。这个命令我们需要看一下太。TR命令,它是进行字符串替换的,压缩、删除也都可以,然后把一组字符串换成另外一组。啊,这个命令啊。是在我们这个脚本里,我们其实试了其他很多方法,发现有些东西其实不是太准,就是这个方略更好,它的作用是啥?你看啊。I输出了一串随机字符串。什么有有这个字母符号,运算符,数字啊,什么各种符号,乱七八糟的都有。
06:01
那怎么办?我用T命令可以干嘛?只从这些符号当中提取数字?那也就是说,你看这条命令回车之后。把这些什么字母,数字、符号都过滤了,就提取出来里边12344个字符。啊,当然他的命令还有很多其他的,我们这里就用了这一个功能,就是说在你输出的随机字符串当中提取我想要的关键字符,原因为啥?我们这个生成的字符串,它除了我们要的字符串是什么文件名啊,是字母数字对吧。那但是它生成的字符串有乱码的,它里边会产生二进制乱码,有二进制乱码不是我们以为的就是什么标点符号这样的加减乘除不是啊。它会有二进制的,而且我们说系统当中一些特殊符号,比如说这样的东西。它都是有特殊含义的,写在文件名当中有可能就不能生效。所以我们它生成的。这个随机字符我们需要通过TR命令来进行过滤,只提取出来其中的某一部分字符。
07:05
我这里的这个例子提的是数字对吧,那我待会儿再提的时候,我是不是就可以提字母和数字了。OK,这就是TR这个作用,好了,那来看看这个脚本,来各位我再说啊,脚本其实就是没有标准答案,我写的这个不一定就是,就是你只要能实现功能,早上写都行,我没问题可以啊。首先。判断一下这个目录在不在。如果不在爱区反手工建立这个目录,因为我们的提示要求在这个艾特硅谷跟下的艾特硅谷里生成随机文件,所以建立这个目录。好了各位,其实我说。我们如果写其他程序,我们这个玩意儿可能就会。嵌套在if当中。我再说。12、程序的功能啊,我一直都在说。事儿,他跟其他语言有本质学。其他的语言,比如说PHP,比如说Python,比如说Java。
08:00
他要求追求的都是效率,就是什么,他有大量的用户在访问,我少写一行代码,我可能执行效率就会高这个百分之几,0.0%几,那我的最终这个加起来,代码越简洁,我的网站访问人数越多,效率越高。但是事儿就根本不是干这个的。十这东西就是给管理员用的,写的程序是在你系统里通过你的系统绝对路径调用的,它不可能让普通用户直接访问。所以事其实我们说为什么一直说事是最简单的语言。因为事可以忽略效率这样的事儿。他就是给我们自己用的。哎,所以啊,我一直在课程中推荐,我推荐的是什么,我们写事的时候可以要求逻辑上简单。就是说好理解,但是代码可以更复杂,那按理说应该把这玩意儿跳到F里边,这样是不是这个代码就会更简洁,所以啊,小象为什么我跳出来了诶。这是符合我们的,或者是我的这种辩证思想啊,我是这样建议,当然这事是我的建议,你可以按照你的建议来写。
09:07
没问题,好了。那我们进入这个目录存在了,进入这个目录循环。十色,哎,各位,为啥我们这里这个提示不是要求生成十个文件对吧,那我们就循环实色。循环14每次循环建立了看嘛。文件名变量等于招了小括号,调用系统命令。它提取大写小写数字,通过这个里面生成字串题,然后has-C。提取前六个就行,哎。这条命令就前面这部分会把什么特殊字符,包括二进制乱码文件全部给过滤掉,对吧,生成一串随机字符串,然后呢。调用前六个就行了。那我试试这句话。我们把这个四句话复设置一下,你看啊,我们先。执行它,我们先执行它。
10:04
我们现执行,你可以看到这里面生成的信息字符串非常多啊,我要不指定调用多少个,这家伙会一直算下去了,没完没了,其实有有尾啊,但是太多了对吧,他申请的,但是你会发现没有二进制对吧。没有二进制的,没有这个符号对吧,我全过滤掉,只剩大写小写和。这个数字对吧,那我们干嘛,前面干嘛。Head嘛,提取文件头不再按行起,而是按这个字符起提取六个啊。六个字。没有加换号,但是在脚本里就无所谓了,对吧,好了,那我们。这里就是这样,那换句话说,在这个变量当中。就是一个六个字符的这个随机字符串,然后生成一个文件,当我们因为已经写了路径了,所以这里是绝对相对路径,只要touch一个文件名后面加下划线GG.txt就结束了,建十个,每个是六个字符串。
11:07
啊,就这么简单,那我们试试。为了节约时间,这个脚本我提前写好了。那我们看一下fairly文件里,看是不是就是我刚刚写的这个脚本。对吧,那我们执行它。慢门直行点杠相对路线直行好。很快啊,看看根,根底下会生成一个叫艾特硅谷的目录,我们进去看看啊。进去好,里面十个随机空文键,以六个字符串开头,后面加这这点T对吧,归固点TT好。这是随机这个字符串的方法,那我再说。编程类的这种题。再说一遍编程这个题,它的实现方法不是一定固定的。我是这样实现的,那别人呢,可以有其他的方式,其他的方法,那我其实我也试了几个方法,那有些方法呢,不是太可靠,生成了,有时候生成了能生成六个,有时候就生成五个,有时候反正就不是太准。
12:10
所以呢,试来试去,我觉得这个方法最简单,再一个呢,相对比较可靠,那还是这句话。其实事儿很少用来写这种底层算法这样的东西很少这样写,所以事儿并不擅长这个东西。这如果是其他的语言当中。他可能更简单或者更合理一点,比如说。把这个这个字符串生成,就直接随机写到数组里,然后通过或者把所有的大写字母,小写字母。把数字写到数组里,然后通过函数自动随机往外蹦就行了,蹦几个就是几个,就这么简单,大多数语言都是这样。OK。那我们为啥不行?原因很简单,我们是的数组里没有这个自动往外蹦的,有数组没有自动往外蹦的这个函数。你这写这么个函数,还不如用这个更简单,我跟你讲啊。好吧。这是那是题第一个。
13:00
看看扩展电视机生成随机随机数,这个就要简单点了,为啥我们有一个系统变量,首先啊,这个read RY这个变量,这是系统环境变量,所以前面加了Dollar Dollar,其次是大写。它默认可以生成随机,生成零到32000多这样一个数字啊,你就直接往外蹦就行了,它就可以生成随随机数。那我们试试味道。I。好,他就会打。I。嗯。DOM吗?阴门啊,好了,随气往外报。这个三万多以内就随机了。多少位都有可能。都有可能。那有人说要想蹦3万万以上的,或者是这个我就奔1000个以内的怎么办?把这个上面加个Dollar双小括号,这里是数值运算的意思,这个然后后面加一个百分号,后面加数字,加1000就是生成1000倍了,加10万就是生成10万这个诶随机数这个还好,其实我告诉你啊。
14:10
这个变量。如果在其他语言中,你就可以把它理解为是函数了。我事先事先写好的功能,直接调用就可以生效。但是事中系统自带的函数很少啊,没有,所以它通过环境变量的方式来实现啊。这样的方式,这是生成随机数的方法,这个就要比生成随机字符串要简单。好,那我们说。这道题就是这样,那我们强调第一件事。编程思想类的题,或者说考察编程类的题,答案不是唯一的啊,我们可能挑了其中一个方法,你可以按照其他方法来写,都是没问题的。第二个事就是,其实这不是事儿本身应该干的事儿。12呢,可能更适合的是做这个什么系统管理类的这种。当然他能干,只是稍微麻烦点。
15:01
或者说跟其他正常语言的方法不是太一样。哎,我跟你讲,不光是这个,只要涉及到那种。其他类语言的一些经典的这种算法题事儿都很别扭,因为它没有自带函数,没有函数。这是第二个事儿啊。那好了,那各位这道题呢,我们就讲到这儿,我们下节课再见。
我来说两句