JavaScript编程题(含腾讯2016校招题)

作者:ManfredHu
链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/
声明:版权所有,转载请保留本段信息,否则请不要转载

几道觉得挺有意思的编程题,感觉做下来,自己对一些新方法的看法有了新的变化。
比如indexOf,reduce,Array.isArray,forEach这些方法,以前一看到兼容性是IE9+就有点害怕,项目中不敢用,导致后面越来越陌生,不过现在一想的话。其实只要用Polyfill或者提前fix掉就可以了。^_^
而且随着浏览器的更新迭代,这些方法肯定会获得更多的支持。

ps:希望新手更要多用这些方法,在特别是学日常学习训练的时候

更新:参加腾讯笔试的编程题,觉得挺有意思的,补上,不过可惜选择语言的时候没有JavaScript。郁闷了好久-_-!!

1. 用reduce统计一个数组中有多少个不重复的单词

var arr = ["apple","orange","apple","orange","pear","orange"];

function getWordCnt(){
    //以下应掏空
    return arr.reduce(function(prev,next,index,arr){
        prev[next] = (prev[next] + 1) || 1; //这句是重点,刚开始都是undefined的时候undefined+1会是NaN
        return prev;
    },{});
}

console.log(getWordCnt());

注意:这里传入了{}作为初始参数,所以第一个prev会是一个空对象,所以第一次的prev[next]会是undefined,而这里用了赋值

2.给定字符串 str,检查其是否包含连续重复的字母(a-zA-Z),包含返回 true,否则返回 false

function containsRepeatingLetter(str) {
    //以下应掏空
    return /([a-zA-Z])\1/.test(str); // \1指代第一个括号的匹配项
}

在正则表达式中,利用()进行分组,使用斜杠加数字表示引用,\1就是引用第一个分组,\2就是引用第二个分组。将[a-zA-Z]做为一个分组,然后引用,就可以判断是否有连续重复的字母。

3.已知fn为一个预定义函数,实现函数curryIt

需要补全的代码

var fn = function(a, b, c) {
    return a + b + c
};
curryIt(fn)(1)(2)(3); //6

function curryIt(fn) {
    //这里补充
}

可以试着玩一下,这里是用的函数的柯里化

var fn = function(a, b, c) {
    return a + b + c
};
console.log(curryIt(fn)(1)(2)(3)); //6

function curryIt(fn) {
    //以下应掏空
    if(typeof fn !== ‘function‘) throw new Error("curryIt():fn must be function");
    var len = fn.length; //获取函数形参数量
    var slice = Array.prototype.slice;
    var arg = slice.call(arguments, 1);
    return function() {
        arg = arg.concat(slice.call(arguments));
        if(arg.length < len) { //当等于函数需要的形参数量时候调用
            return arguments.callee;
        }else{
            return fn.apply(null,arg);
        }
    }
}

4. 蛇形矩阵(2016腾讯校招编程题)

作为一种常用的数学数列,是由1开始的自然数一次排列成的一个N*N的正方形矩阵,数字一次由外而内的递增,如下面实例:

n=3的蛇形矩阵
1 2 3
8 9 4
7 6 5

n=6的蛇形矩阵
 1  2  3  4  5  6
20 21 22 23 24  7
19 32 33 34 25  8
18 31 36 35 26  9
17 30 29 28 27 10
16 15 14 13 12 11

此题要求输入蛇形矩阵宽度N,输出整个蛇形矩阵结果,注意输出格式要求按照矩阵从上至下的依次按行输出,每行中间无需换行输出。

样本输入: 3
样本输出: 1 2 3 8 9 4 7 6 5

自己写的答案(欢迎补充)^_^

//可以把代码复制到Chrome控制台运行
;
(function() {
    function fixIsArray() {
        if (!Array.isArray) {
            Array.isArray = function(arr) {
                return Object.prototype.toString.call(arr).slice(8, -1) === "Array";
            }
        }
    }
    fixIsArray(); //fix Array.isArray(Array.isArray在IE9+支持)

    function Arr2D(d) {
        if (typeof d !== ‘number‘) throw new Error(‘Arr2D():arguments d must be number‘);
        this.d = d;
        this.arr = this.init2DArr(d);
    }

    Arr2D.prototype.reat2DArr = function() {
        var c = 0, //环数
            i = 0, //行
            j = 0, //列
            out = 1, //总数
            z,
            n = this.d,
            a = this.arr;

        //检验参数
        if (!Array.isArray(a)) throw new Error(‘reat2DArr():arguments a must be Array‘);
        if (typeof n !== ‘number‘) throw new Error(‘reat2DArr():arguments n must be Number‘);

        z = n * n;

        while (out <= z) {
            i = 0; /*每轮后初始化下i,j*/
            j = 0;
            for (i += c, j += c; j < n - c; j++) {
                if (out > z) break;
                a[i][j] = out++;
            }
            for (j--, i = i + 1; i < n - c; i++) {
                if (out > z) break;
                a[i][j] = out++;
            }
            for (i--, j = j - 1; j >= c; j--) {
                if (out > z) break;
                a[i][j] = out++;
            }
            for (j++, i = i - 1; i > c; i--) {
                if (out > z) break;
                a[i][j] = out++;
            }
            c++;
        }

        return this;
    };

    Arr2D.prototype.printArr = function() {
        var a = this.arr,
            n = this.d,
            lineStr;
        if (!Array.isArray(a)) throw new Error(‘printArr():arguments a must be Array‘);
        for (i = 0; i < n; i++) {
            lineStr = "";
            for (j = 0; j < n; j++) {
                lineStr += ‘ ‘ + a[i][j];
            }
            console.log(lineStr);
        }

        return this;
    };

    //初始化二维矩形数组
    Arr2D.prototype.init2DArr = function(m) {
        var arr = [],
            i, j;
        for (i = 0; i < m; i++) {
            arr[i] = [];
            for (j = 0; j < m; j++) {
                arr[i][j] = 0;
            }
        }
        return arr;
    };

    //调用函数,测试数据数据为3
    var arr = new Arr2D(3);
    arr.reat2DArr().printArr();

})();

5. 大招来了:特别的回文字符串(2016腾讯校招编程题)

所谓回文字符串,就是一个字符串,从左到右和从右到左读是完全一样的。比如”abc”、”c”。
对于一个字符串,可以通过删除某些字符而变成回文字符串,如”cabebaf”,删除’c’,’e’,’f’后
剩下子串’abba’就是回文字符串。
要求,给定任意一个字符串,字符串最大长度1000,计算出最长的回文字符串长度。
如’cabebaf’的回文字符串包括’c’,’aba’,’abba’等,最长回文”abba”长度为4。
输入:字符串
输出:最大的回文字符串长度。
示例:
输入:cabbeaf
输出:4

问题:个人是觉得上面这道题的描述是有问题的,比如cabebaf,那么abeba算不算回文?通常应该是算的。但是按照题目的意思则是abba才算回文,abeba是不算的。

而且这里有干扰项,输入示例的cabbeaf中,要删除字符e才能检测出回文abba。所以这跟普通的回文判断完全不一样。

普通的估计用这样的方法就能判断了

//判断如abba,abeba这样的字符串
function testArr(str) {
    //将字符串切割为字符数组,倒序反转再判断跟原来的字符串是否一样
    return str.split(‘‘).reverse().join(‘‘) === str;
}

但是这里不是普通的题目,所以刚开始我想的是用indexOflastIndexOf来做,通过字符串的逐渐缩小范围,indexOflastIndexOf又可以避免要删除字符e的尴尬。

;
(function() {
    //输入:cabbeaf
    //4
    String.prototype.roundWord = function() {
        var i = 0,
            str = this,
            count = 0, //回文计数
            left, right = str.length - 1,
            max = 0,
            flag = false;

        if (str.length <= 0) throw new Error("roundWord(): arguments str/this must be string");

        while (i < str.length) {
            charOne = str.charAt(i);
            left = str.indexOf(charOne, i);

            if (!flag) {
                right = str.lastIndexOf(charOne);
            } else {
                right = str.lastIndexOf(charOne, right);
            }

            if (left !== right && left < right) { //头尾有相同字符
                if (++count >= max) max = count;
                flag = true; //开始有回文
            }
            i++;

        }
        return count*2;
    };

    var str = "cababeacf123";
    console.log(str.roundWord()); //6
    str = "cabbeaf";
    console.log(str.roundWord()); //4

})();
时间: 2024-10-26 04:50:16

JavaScript编程题(含腾讯2016校招题)的相关文章

腾讯2016校招编程题【PHP实现】

2016腾讯春招的编程题 话不多说,直接上题!!! 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢?输出需要删除的字符个数 . 这道题是以回文为载体,考察两个字符间的最大子串,最大子串算法在表示字符串的关联度上用途很广泛. 而遮到题就是字符串的长度减去其和翻转字符串的长度的最大子串即可.最长子串的算法我一开始也是蒙的.这完全没没思路呀. 后来看到一篇blog,才明白最长子串,好的,最后我们形成代码 代码实现: function solution

2016年下半年信息安全工程师考试真题含答案(下午题)

2016年下半年信息安全工程师考试真题含答案(下午题) https://www.moondream.cn/?p=328 试题一(共20分) 阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内. [说明] 研究密码编码的科学称为密码编码学,研究密码破译的科学称为密码分析学,密码编码学和密码分析学共同组成密码学.密码学作为信息安全的关键技术,在信息安全领域有着广泛的应用. [问题1](9分) 密码学的安全目标至少包括哪三个方面?具体内涵是什么? [问题2](3分) 对下列违规安全事件,

2016校招之360在线笔试

刚刚参加了奇虎360的2016校招在线笔试,记录一下. 填空题:40题 编程题 :2题 考试时间:150分钟 博主投的是C/C++后台开发 填空题具体不记得了,只是涉及面很广,包括python,php,操作系统,C/C++,数学概率,数据结构与算法,数据库,正则表达式,设计模式等等 编程题: 1.找一个合适的人当村长,意思是:一个村子里选村长,这个村长必须满足以下条件: (1) 他除了自己,不认识村子里的其他人(默认每个人都认识他自己) (2) 村子里的其他人都认识他 村子里的每个人从1~N编号

Javascript编程风格

转自阮一峰 http://www.ruanyifeng.com/blog/2012/04/javascript_programming_style.html 作者: 阮一峰 日期: 2012年4月27日 Douglas Crockford是Javascript权威,Json格式就是他的发明. 去年11月他有一个演讲(Youtube),谈到了好的Javascript编程风格是什么. 我非常推荐这个演讲,它不仅有助于学习Javascript,而且能让你心情舒畅,因为Crockford讲得很幽默,时不

[已读]JavaScript编程精解

译者汤姆大叔,应该很多人都知道,他写了一系列的关于闭包与作用域理解的文章,但是由于创建了一些我不理解的新名词,我不爱看. <JavaScript编程精解>算是买得比较早的一本书,那会大肆搜罗js基础书籍,这本应该是在我看完<javascript高级程序设计(第二版)>之后,紧接着看的,金玉在前,所以,原谅我对它的印象不够好,另外,我没有耐心按照书中生态圈的例子一点一点敲代码,对很多人提到的这本书的趣味性也就没有体会. 关于内容,首先,它不适合没有基础的读者看,会有一点难看懂.第二,

【转】这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已

[转]这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已 Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);定义一个变量rate是1到5的值,然后执行上面代码,看图 才发现插件什么的都弱爆了 2.如何装逼用代码骂别人SB (!(~+[])+{})[--[~+&qu

JavaScript 编程珠玑 - 《JavaScript: The good parts》总结(2)

一.扩展函数原型的更好办法: // 定义下面的通用方法 Function.prototype.method = function (name, func) {     this.prototype[name] = func;     return this; }; // 使用上面的通用方法作为工具进行扩展,以免每次扩展都访问Function.prototype.XXX (that's ugly). Number.method('integer', function() {     return 

前端代码编码和设计规范系列——JavaScript编程规范

1文档信息 条目 内容 项目编号 通用 项目名称 通用 标题 JavaScript编程规范 类别 规范文档 当前 试用草稿 摘要 当前版本 V1.0 日期 2015/11/9 作者 徐维坚(xuweijian) 文档拥有者 内部公开 文件 前端规范系列-JavaScript篇.docx 2修改历史 编号 修订人 修订内容简述 修订 日期 修订前 版本号 修订后 版本号 V0001 徐维坚 编程规范文件编写,草稿试用版公布 2015/11/10 V1.0 规范前言 良好的编程规范对于软件的开发与维

JavaScript 编程珠玑 - 《JavaScript: The good parts》总结(1)

<JavaScript: The Good Parts>,解释了JavaScript编程的精髓.理解本书能够解释我们实际编程中遇到的很多问题,并且有助于写出高质量的代码.这里总结了一下要点,其主要内容涉及到JavaScript特殊的语法,理解Prototype,正确解析this的指代,函数对象的使用,闭包的使用等. 1. JavaScript 语法和对象的特别之处 1) 两种获取对象属性值的方法:[] 或.       stooge['first-name']       stooge.nic