下面的笔试题是我们公司针对于刚进行过入门培训的 JS 工程师出的测试题, 主要考察参加培训员工对于基础知识的掌握程度.
[quote]
[1] 下面表达式的运算结果是什么?
javascript 代码
- console.log(1 + - + + + - + 1);
- [/quote]
- [quote]
[2] 下面表达式的运算结果是什么?
javascript 代码
- var a = 10, b = 20, c = (a++,b++,100);
- console.log(c);
- [/quote]
- [quote]
[3] 实现一个函数, 返回输入参数是否为质数
javascript 代码
- function isZhiShu(m){
- /* 返回布尔值 */
- }
- [/quote]
- [quote]
- [4]
- /**
- 如果传入的参数是字符串, 则将改字符串按照字母出现的次数由大到小重新排列
- exp:'ddxsss'=>'sssddx'
- 如果不是字符串类型, 不做任何修改, 返回 FALSE
- @return {Boolean} 是否转换成功
- */
- function sortStringByCount(){}
- [/quote]
- [quote]
- [5]
- /**
- 获取斐波那契数列的第 n 个值
- 如果 n 不是有效的数字则返回 undefined
- @return {Number|undefined}
- */
- function getFBN(n){}
- [/quote]
- [quote]
- [6]
- /**
- 计算从 10 到 100 中能被 3 或 5 整除的数的和
- @return {number} [description]
- */
- function getSum()
- [/quote]
- [quote]
- [7]
- /**
- 将传入的字符串翻转输出, 如果不是字符串输出 undefined
- @return {String |undefined} [description]
- */
- [/quote]
[8] 实现一个函数, 来判断输入字符串是否为 "回文"(忽略大小写), 如: Helleh, 王中王
[9] 去除字符串中重复的字符
- [quote]
- [10]
- /**
- 输出 1000 内水仙花数
- 水仙花数是指一个 n 位数 ( n3 ), 它的每个位上的数字的 n 次幂之和等于它本身.(例如: 1^3 + 5^3+ 3^3 = 153)
- 三位的水仙花数共有 4 个: 153,370,371,407
- @return {undefined} [description]
- */
- function shuixianhua(){}
- [/quote]
============================================================== 分割线 ==============================================================
解答
[quote]
[1]
难度:
考点: 运算优先级
解答: 题中只有简单的加减运算 (注意没有每个运算符中间都有 "空格", 所以不存在如 ++ 的一元运算), 所以自左向右, 都是取正或取反的运算, 最后是 1+1, 所以结果是为 2
- [/quote]
- [quote]
- [2]
难度:
考点: 运算符的优先级
解答: 这里的运算符逗号是 "多重求值", 不论多少个逗号, 都是返回最后一个逗号后面的值
- [/quote]
- [quote]
- [3]
难度:
考点: 数学运算, 逻辑运算, 循环
参考代码如下
javascript 代码
- function isZhiShu(m){
- if(m <= 1 || m%1 !== 0) {
- return false;
- }
- var n = 2;
- while(n<m){
- if(m%n==0){
- return false;
- }else{
- n++;
- continue;
- }
- }
- return true
- }
- console.log(isZhiShu(4));
- console.log(isZhiShu(7));
- console.log(isZhiShu(997));
更优算法如下, 为高端玩家提供
javascript 代码
- function isPrime(number) {
- if (typeof number !== 'number' || number<2) {
- // 不是数字或者数字小于 2
- return false;
- }
- if (number === 2) {//2 是质数
- return true;
- } else if (number % 2 === 0) {// 排除偶数
- return false;
- }
- var squareRoot = Math.sqrt(number);
- // 因为 2 已经验证过, 所以从 3 开始; 且已经排除偶数, 所以每次加 2
- for(var i = 3; i <= squareRoot; i += 2) {
- if (number % i === 0) {
- return false;
- }
- }
- return true;
- }
- console.log(isPrime(4));
- console.log(isPrime(7));
- console.log(isPrime(997));
- [/quote]
- [quote]
- [4]
难度:
考点: String,Object, 循环, 算法, 逻辑运算
解答: 如果是我, 我会像下面写代码
javascript 代码
- function sortStringByCount(str){
- return (typeof str =='string') && str.constructor==String && (str !== str.split('').sort().join('').match(/(.)\1{0,}/g).sort(function(a,b){return b.length - a.length}).join(''))
- };
- var s = 'jkafyauufaahfiuaoudsaojdasxkckxhfdaui';
- console.log(sortStringByCount(s))
但是, 这是一道针对初学者的考题, 也就是解题办法限制在不可用字符串自带的方法和数组的方法, 也不可以用正则表达式.
想了好久, 没想出来该怎么做, 希望高手指点.
- [/quote]
- [quote]
- [5]
难度:
考点: 循环, 算法, 逻辑运算
解答: 这个用递归很好解决, 代码如下:
javascript 代码
- function getFBN(n){
- if(typeof n !== 'number'){
- return
- }
- if(n <0){
- return 1
- }else if(n <= 2){
- return 2
- }
- return getFBN(n-1) + getFBN(n-2);
- }
- console.log(getFBN(-1))
- console.log(getFBN('asd'))
- console.log(getFBN(3))
当然, 这道题是针对初学者的, 所以递归当然是不能用的了, 可以用下面的代码计算
javascript 代码
- function getFBN(index){ // 刚
- var firstnum=1; // 第一个值
- var secondnum=1;// 第二个值
- var thirdnumResult=0;// 结果 第三个值
- if(typeof index !== 'number'){
- return
- }
- for (var i = 0; i < index-2; i++) { // 循环 1 次, 得到第三个数 2 次得到第四个数 index-2 次得到第 index 个数
- thirdnumResult=firstnum+secondnum;
- firstnum=secondnum; // 现在的 3 个值的第一个, 已经变成了原来三个中的第二个
- secondnum=thirdnumResult;// 现在的 3 个值的第二个, 已经变成了来三个中的第三个, 结果
- }
- return thirdnumResult;
- }
- console.log(getFBN(-1));//0
- console.log(getFBN(1));//0
- console.log(getFBN(2));//0
- console.log(getFBN(3));//2
- console.log(getFBN(8));//21
- [/quote]
- [quote]
- [6]
难度:
考点: 循环, 数学运算
解答: 代码如下
javascript 代码
- function getSum(){
- var sum = 0;
- for(var i = 10; i <= 100; i++){
- sum += (i%3===0 || i%5 ===0) && i
- }
- return sum
- }
- console.log(getSum())
- [/quote]
- [quote]
- [7]
难度:
考点: String, 循环
解答: 代码如下
javascript 代码
- function getReverse(str){
- var result = ''if(typeof str !=='string'){
- return
- }
- for(var len = str.length,i=len-1;i>=0;i--){
- result += str[i]
- }
- return result;
- }
- console.log(getReverse('abcdef'))
当然这道题最简单的办法肯定是下面的处理
javascript 代码
- function getReverse(str){
- if(typeof str !== 'string'){
- return null
- }
- return str.split('').reverse().join('')
- }
- console.log(getReverse('abcdef'))
- [/quote]
- [quote]
- [8]
难度:
考点: 循环, 逻辑判断
解答: 代码如下:
javascript 代码
- function isHuiwen(str){
- if(typeof str !== 'string' || str.constructor !== String){
- return false
- }
- for(var i = 0,len = (str.length+1)/2;i<len;i++){
- if(str[i] !== str[str.length-i-1]){
- return false;
- }
- }
- return true
- }
- console.log(isHuiwen('abba'))
- console.log(isHuiwen('王中王'))
- console.log(isHuiwen('abbxa'))
- [/quote]
- [quote]
- [9]
难度:
考点: 循环, Object, 算法
解答: 代码如下:
javascript 代码
- function getNoRepeat(str){
- var tempObj = {},result='';
- if(typeof str !== 'string' || str.constructor !== String){
- return false;
- }
- for(var i=0, len=str.length; i <len; i++){
- if(!tempObj[str[i]]){
- result += str[i];
- tempObj[str[i]] = true;
- }
- }
- return result;
- }
- console.log(getNoRepeat('aabbssabsdd'))
- [/quote]
- [quote]
- [10]
难度:
考点: 数学运算, 循环, 算法
解答:
这道题如果用 Math 对象会非常简单, 但是由于初学者们还没有掌握 Math 对象, 所以就只能另寻其他途径. 除此以外, 发现网上得代码写的好 low, 我做了一些改进.
代码如下:
javascript 代码
- // 先封装一个简易版的 Math.pow 封装
- // 先封装一个简易版的 Math.pow 封装
- function posPow(n,x){
- var result = n;
- if(x===0){
- return 1
- }
- if(x < 0){
- // 只运算乘方
- return null
- }
- while(x>1){
- result = result*n;
- x--;
- }
- return result;
- }
- // 最终函数
- function narc(max){
- var resultList = [],
- maxDigit=3, //max 的位数
- tempResult=0;
- if(max <= 100){
- return null;
- }else if(typeof max !== 'number'){
- return null
- }
- // 取得 max 的位数
- maxDigit = max.toString().length+1;
- // 第一层对于位数进行循环, 从 3 位开始
- for(var digit = 3; digit <= maxDigit; digit++){
- // 第二层循环从 0 到 Max
- for(var i = 100; i < max; i++){
- tempResult = 0;
- // 第三层循环, 从 i 的第 0 位到最后一位
- for(var j=0;j<digit-1; j++){
- tempResult += posPow(i.toString()[j], digit-1)
- }
- (tempResult === i) && (resultList[resultList.length] = i)
- }
- }
- return resultList;
- }
- console.log(narc(1000))
- console.log(narc(10000))
- console.log(narc(8209))
- [/quote]
来源: http://www.qdfuns.com/article/21719/521f8a995afd7994f7d48bc2e073a724.html