6 kyu to 5 kyu: 菜鸟回归,先来一个简单的
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

推荐一个视频【老外眼中的淘宝和马云】,笑着看到视频的最后,看完之后也是心情一顿澎湃,但平静之后又陷入的反思:我能笑到人生的最后吗?

菜鸟回归,续写奋斗篇章。

先来看题目

Write a function, which takes a non-negative integer (seconds) as input and returns the time in a human-readable format (HH:MM:SS)

  • HH = hours, padded to 2 digits, range: 00 - 99
  • MM = minutes, padded to 2 digits, range: 00 - 59
  • SS = seconds, padded to 2 digits, range: 00 - 59

The maximum time never exceeds 359999 (99:59:59)

You can find some examples in the test fixtures.

和往常一样,题目摘自【codewars

菜鸟初体验

拿到这个题的时候,感觉也是太简单了,一点也不像 6-5(kyu) 的题目啊。但是也是长时间没做题了,就先拿它练个手吧。

  1. 拿到一个数 seconds。分别求出 HHMMSS.
function humanReadable(seconds) {
  // TODO
  var ss = seconds%60;
  var mm = Math.floor(seconds/60)%60;
  var hh = Math.floor(seconds/3600);

  return hh + ':' + mm + ':' + ss;
}
  1. 但是这样求出来的数将有可能是小数,所以Math.floor(seconds/n)

  2. 然后,‘00’ 这样的格式小处理一下,就可以呈上我菜鸟的一血了。

function humanReadable(seconds) {
  // TODO
  var ss = seconds%60;
  ss = (ss < 10)? ('0' + ss): ss;

  var mm = Math.floor(seconds/60)%60;
  mm = (mm < 10)? ('0' + mm): mm;

  var hh = Math.floor(seconds/3600);
  hh = (hh < 10)? ('0' + hh): hh;

  return hh + ':' + mm + ':' + ss;
}

菜鸟再思考

在提交通过之后,突然又想到了,Date 对象不是有个 toLocaleTimeString() 可以直接把 Date 对象的时间部分转换为字符串。直接呈代码:

function humanReadable(seconds) {
  // TODO
  var d = new Date();
  d.setTime(seconds * 1000);

  return d.toLocaleTimeString();
}

但是这个却没有通过,原来这样得出来的 HH 取值范围为 00 - 24。想过可以加点什么代码,但感觉比一血要麻烦,也就这样放弃了。

偷师学艺

每次提交代码,都会看一下高手们有没有更好的解法,自排名前三中选出一个我能看懂且自认为最优的解法贴出来。

function humanReadable(seconds) {
  var pad = function(x) { return (x < 10) ? "0"+x : x; }
  return pad(parseInt(seconds / (60*60))) + ":" +
         pad(parseInt(seconds / 60 % 60)) + ":" +
         pad(seconds % 60)
}

通过比较,找出和自己思维的不同点,便是学到了东西,得到了提高:

  1. 分别求出 HHMMSS 的时候都用到了 (x < 10) ? "0"+x : x;,他就直接做成了一个函数,于是代码量减少了。

  2. 对于小数转整数,他用了 parseInt() 方法。

未解之谜

小数转整数, parseInt()Math.floor() 哪个更优?都有啥优缺点?更适合啥使用场景?

另,长期收购最优解题答案。


2014.10.04 更新

刚刚看到两个小数转整数的方法,据说比同类要快。

  • var foo = (12.4/4.13) | 0 //结果为3
  • var bar = ~~(12.4/4.13) //结果为3
评论
发表评论
5年前
function humanReadable(seconds) {
    return (0.001 + parseInt(seconds / 3600) / 100).toString().substr(2, 2) + ':' +
        (0.001 + parseInt(seconds % 3600 / 60) / 100).toString().substr(2, 2) + ':' +
        (0.001 + parseInt(seconds % 60) / 100).toString().substr(2, 2);
}

我的话大概是这样的。

以及关于位运算——因为 javascript 本身就是浮点数,没有整数型,所以位运算对于他们而言也是要强制转化为整数,效率上没有太大的提高。因为位运算是针对整数型的。

WRITTEN BY
BoltDoggy
A doggy named Bolt.
TA的新浪微博
PUBLISHED IN
My Code Wars 我的代码战争【休息一下】

这里讲述的是一个8级(kyu)菜鸟立志成为8段(dan)大神的故事。

他在代码战争中一次次遭遇挫败,而又在乱炖中获得高人指点。

遥想当年自高自大,而今终知天外有天。

坚持要走出一条自己的路,这是一条不归路。


Bolt 在写underscore.js源码分析专栏的时候发现了一个问题,就是看别人写的代码的时候自认为看懂了,但实际上有理解错误自己也不知道。

另外就是看了再牛逼的代码,自己写的时候,还是那些小套套。

于是 Bolt 开了一个新专栏:My Code Wars 我的代码战争。在同一需求下,菜鸟写的代码与大神有什么区别,是思维方式不同,还是什么原因导致的?

欢迎大家来新专栏提供意见和建议。

我的收藏