Your task is to program a function which converts any input to an integer.

Do not perform rounding, the fractional part should simply be discarded.

If converting the input to an integer does not make sense (with an object, for instance), the function should return 0 (zero).

Also, Math.floor(), parseInt() and parseFloat() are disabled for your unconvenience.

Onegaishimasu!

function toInteger(n) {
var arr, i, ret = 0, sgn = 1, mul;
var pos, front, matches, swap;
if(typeof n == 'string' || typeof n == 'number'){
n += '';
if(n.slice(0, 1) == '-'){
sgn = -1;
n = n.slice(1);
}
if(matches = /^(\d*\.\d+)e(-?\d+)$/i.exec(n)){
front = matches[1];
mul = toInteger(matches[2]);
pos = front.indexOf('.');
arr = front.split('');
if(mul >= 0){
for(i = 0; i < mul; ++i){
swap = arr[pos + i];
arr[pos + i] = arr[pos + i + 1];
arr[pos + i + 1] = swap;
if(arr[arr.length - 1] == '.')arr.push('0');
}
}else{
if(pos < -mul){
for(i = -mul - pos; i > 0; --i){
arr.unshift('0');
}
}
for(i = 0; i > mul; --i){
swap = arr[pos + i];
arr[pos + i] = arr[pos + i - 1];
arr[pos + i - 1] = swap;
}
}
}else{
arr = n.split('');
}
for(i = 0; i < arr.length; ++i){
if(arr[i] >= '0' && arr[i] <= '9'){
ret = ret * 10 + (arr[i] - '0');
}else if(arr[i] == 'e' || arr[i] == 'E'){
mul = arr.slice(i + 1).join('');
if(!/^-?\d+$/.test(mul)){
ret = 0;
break;
}
mul = toInteger(mul);
ret *= (mul > 0? Math.pow(10, mul): Math.pow(.1, - mul));
ret = toInteger(ret);
break;
}else if(arr[i] == '.'){
break;
}else{
ret = 0;
break;
}
}
}
else if(n === true)return 1;
return ret * sgn;
}

It passes all my unit tests, can not figure out what is wrong with my code.

Test.assertEquals(toInteger(1), 1)
Test.assertEquals(toInteger('1e-2'), 0)
Test.assertEquals(toInteger('-20e-2'), 0)
Test.assertEquals(toInteger('-.98720e-2'), 0)
Test.assertEquals(toInteger('-200.67e-2'), -2)
Test.assertEquals(toInteger('-200.67e3'), -200670)
Test.assertEquals(toInteger('-200.67e0'), -200)
Test.assertEquals(toInteger('-1234e-5'), 0)
Test.assertEquals(toInteger('1234e7'), 12340000000)
Test.assertEquals(toInteger('-200e-2'), -2)
Test.assertEquals(toInteger('e-0'), 1)
Test.assertEquals(toInteger('.3e1'), 3)
Test.assertEquals(toInteger('5000e-2'), 50)
Test.expect(toInteger("4.55") === 4)

后面我修了一下,简化了这部分的逻辑,加入了对16进制、8进制和单元素数组的处理……最后终于被迫用eval破了这个kata。

看了其他人的答案,发现问题的关键是用位运算符,它自带Int32的操作……

例如~~n, n >> 0, n | 0, n ^ 0,这些都是可行的直接切割整数部分的技巧。

code wars quiz: toInteger的更多相关文章

  1. Web site collections

    Integration 伯乐在线 极客头条 Hacker News Stack Overflow RFC Search Security Python Hacker - Freebuf PrimalS ...

  2. 递归调用里的性能问题(js)

    说明 这是在codewars.com上刷的一道js练习题,在此做个记录 问题描述 The Fibonacci sequence is traditionally used to explain tre ...

  3. Concurrent.Thread.js

    (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...

  4. Quiz(贪心,快速幂乘)

    C. Quiz time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  5. mysql----JOIN Quiz

    JOIN quiz game id mdate stadium team1 team2 1001 8 June 2012 National Stadium, Warsaw POL GRE 1002 8 ...

  6. mysql----Nested SELECT Quiz

     Nested SELECT quiz bbc name region area population gdp Afghanistan South Asia 652225 26000000   Alb ...

  7. (转载)ASP.NET Quiz Answers: Does Page.Cache leak memory?

    原文地址:http://blogs.msdn.com/b/tess/archive/2006/08/11/695268.aspx "We use Page.Cache to store te ...

  8. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  9. 我们是怎么做Code Review的

    前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...

随机推荐

  1. 编写第一Spring程序

    构建Spring项目 通过https://start.spring.io/来构建项目,在这里我选择了两个依赖,web 和 Actuator. 项目结构 通过eclipse导入项目,可以看到这是一个标准 ...

  2. Java多线程(三)SimpleDateFormat

    多线程报错:java.lang.NumberFormatException: multiple points SimpleDateFormat是非线程安全的,在多线程情况下会有问题,在每个线程下得各自 ...

  3. V形

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  4. Selenium常用方法及函数

    新建实例driver = webdriver.Chrome() 1.获取当前页面Url的函数方法:current_url实例:driver.current_url 2.表单的提交方法:submit解释 ...

  5. Ubuntu 16.04安装Kate文本编辑工具

    Kate支持很多语言,比如NASM,比SBL3低那么一点,但是比Gedit好. 安装: sudo apt-get install kate 启动: 额外配置: 1.安装Kwrite sudo apt- ...

  6. IBatis的分页研究

    IBatis的分页研究 博客分类: Ibatis学习   摘自: http://cpu.iteye.com/blog/311395 yangtingkun   Oracle分页查询语句 ibaits. ...

  7. x86汇编之十(使用字符串)

    x86汇编之十(使用字符串) 转自网络,出处不详 一.传送字符串 Intel提供了完整的字符串传送指令,就像是MOV指令一样. 1.MOVS指令 1)movs指令格式 把字符串从一个位内存位置传送到另 ...

  8. RocketMQ学习笔记(14)----RocketMQ的去重策略

    1. Exactly Only Once (1). 发送消息阶段,不允许发送重复的消息 (2). 消费消息阶段,不允许消费重复的消息. 只有以上两个条件都满足情况下,才能认为消息是“Exactly O ...

  9. java 23种设计模式 链接集锦

    创建型抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html工厂方法 http://www.cnblogs ...

  10. Vue指令7:v-model

    可以用 v-model 指令在表单控件元素上创建双向数据绑定. v-model 会忽略所有表单元素的 value.checked.selected 特性的初始值. 因为它会选择 Vue 实例数据来作为 ...