我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第2篇文章,点击查看活动详情
在被几次笔试算法题痛击后,我决定再战算法,秉持死磕到底的精神,我又写出来了我的第二道算法题
题目
这道题是一家大厂的笔试算法题,难度比较简单(对算法大佬而言)
给一行字符串,字符串第一个是一串时间戳,➕空格,时间戳后是对应的要输出的时间格式,其中包含以下形式来代表时间(‘yyyy’表示年,‘MM’表示月,‘dd’表示日,‘HH’表示小时,‘mm’表示分钟,‘ss’表示秒)表示时间的形式可以出现0-n次,时间戳和格式会用一个空格分开,输出格式要求按照输入格式的样式(包括空格)
由于文本编辑器不能处理多个空格,所以栗子用图片给出,外加这是一道笔试原题,所以在网上我没找到题目,就只能按照以上文字来作为参考,也没有专门的编辑器,所以我给出原题的三个例子作为参考
//输入:1660653659557 yyyy年MM月dd日-HH:mm:ss
//输入:1660653659557 yyyy MM dd -HH:mm:ss
//输入:1660653659557 yyyy yyyy yyyy ss
解析
环境是javascript v8
1.输入处理
我们都知道,在牛客(大部分公司笔试都用的牛客)编辑器中,都用readline()读取输入,⚠️注意的是 读取到的是一串字符串,所以需要进行一定的加工处理
1.因为这个地方我们需要分别拿到时间戳和时间格式,所以需要把字符串用split()方法转化为数组,这样方便获取(在很多算法题中,都经常用split方法处理),题目说会将时间戳和格式用空格分开,那么就先按照空格进行数组的划分
2.接下来就会得到一个根据空格划分的数组,数组的每一项都是string类型,用下表【0】拿到时间戳
注意此时时间戳为string)
3.时间格式直接用slice(1)得到新数组就行啦
2.时间处理
根据题目可知,我们需要通过时间戳获取年月日时分秒,第一个想到的肯定就是用Date的内置方法来处理
这里就是考对Date的方法是否熟悉
new Date(时间戳)可以得到转化出来的具体时间,但是我们需要具体得到的话,就可以用到对应的方法来解决,getFullYear()可以得到年份。 (详情见代码)
但是注意,传入Date的参数需要是number类型,但我们获得的时间戳目前是string,就需要用Number()转化
然后分别得到年月日时分秒
var time = Number(lineArr[0]);
var year = new Date(time).getFullYear();
var month = new Date(time).getMonth() + 1;
var day = new Date(time).getDate();
var hour = new Date(time).getHours();
var minutes = new Date(time).getMinutes();
var second = new Date(time).getSeconds();
3.如何匹配和替换
一开始我就想到了正则匹配,但是由于我对正则不是很熟悉,就想用传统的方法来匹配到每个字符然后替换成对应的时间就行,但是事实告诉我,我的算法思维和对方法的熟练度并不允许我轻松的写出来
所以我还是写正则表达式吧
首先如果根据每个时间的格式写一次正则,而且时间的格式一共就6个,干脆来个for循环比较方便,所以需要把时间格式和获取到的时间用数组存起来。
正则表达式
其实这个匹配比较简单,就是注意添加好全局匹配的修饰符g就行
替换可以用字符串的replace方法,可以传两个参数,第一个是要替换的字符串目标,第二个参数是要替换的子串。第一个参数也可以写为正则表达式
所以现在问题的解决形式就比较明了了
完整代码
var line = "1660653659557 yyyy yyyy yyyy ss yyyy yyyy yyyy ss";
var lineArr = line.split(" ");
var time = Number(lineArr[0]);
var year = new Date(time).getFullYear();
var month = new Date(time).getMonth() + 1;
var day = new Date(time).getDate();
var hour = new Date(time).getHours();
var minutes = new Date(time).getMinutes();
var second = new Date(time).getSeconds();
var styleArr = lineArr.slice(1);
var style = styleArr.join(" ");
var n = style.length;
var styles = ["yyyy", "MM", "dd", "HH", "mm", "ss"];
var times = [year, month, day, hour, minutes, second];
function replaceStyle() {
for (var i = 0; i < 6; i++) {
var reg = new RegExp(styles[i], "g");
style = style.replace(reg, times[i]);
// style = style.replace(styles[i], times[i]);
}
}
replaceStyle();
console.log(style);
小小小小白什么时候能变成算法小白呢😳
如果有不对的地方,欢迎指导
转载:欢迎转载,但未经作者同意,必须保留此段声明;