与函数有关面试题(一)
来源:互联网 发布:淘宝上的iphone6s 编辑:程序博客网 时间:2024/06/05 02:55
- 如何将字符串进行反转
解题思路:字符串本身没有反转方法,先将字符串转为数组,再用reverse()方法
将字符串转为数组=》用slice(“”)方法,对数组进行空气分割,转化成数组。
代码如下:
var abc="abcdergfdfgdfg"; var def=abc.slice(""); console.log(def.length); var result=[]; function fun() { for (var i = 0; i < def.length; i++) { result[i] = def[i] } return result.reverse(); } console.log(fun().toString());
最后得到的结果就是反转后的字符串
2.检测字符串是否为回文
如果给定的字符串是回文,返回true,反之,返回false。
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。
思路如下:正则匹配出所有的标点符号,大小写,空格,匹配后的结果与该结果反转后值相等,则为回文,反之为非回文。
代码如下:
方法1。正则表达式match匹配
function palindrome(str) {var result=[];var reg=/[0-9a-zA-Z\+]+/g;str = str.match(reg).join("").toLowerCase();for(var i=0;i<str.length;i++){ result.push(str[i])}var newstr=result.reverse();if(newstr.join("").toLowerCase()==str) { return true;}else{ return false; }}document.write(palindrome("eye123"));
方法二。正则表达式replace替换,正则表达式可以通过“^”符号作为左方括号内的第一个字符,表示否定字符类=》非或者说取反。
function palindrome(str) {var result=[];str=str.replace(/[^[a-z0-9A-Z+]+/g,"");for(var i=0;i<str.length;i++){result.push(str[i]);}var newstr=result.reverse();if(newstr.join("").toLowerCase()==str.toLowerCase()) {return true;}else{return false;}}palindrome("eye");
3.M选N
<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="UTF-8"> <title>Javascript</title></head><body><script > var st=new Date().getTime(); function arrayCombine(targetArr) { if(!targetArr || !targetArr.length) { return []; } var len = targetArr.length; var resultArrs = []; // 所有组合 for(var n = 1; n < len; n++) { var flagArrs = getFlagArrs(len, n); while(flagArrs.length) { var flagArr = flagArrs.shift(); var combArr = []; for(var i = 0; i < len; i++) { flagArr[i] && combArr.push(targetArr[i]); } resultArrs.push(combArr); } } return resultArrs; } /** * 获得从m中取n的所有组合 */ function getFlagArrs(m, n) { if(!n || n < 1) { return []; } var resultArrs = [], flagArr = [], isEnd = false, i, j, leftCnt; for (i = 0; i < m; i++) { flagArr[i] = i < n ? 1 : 0; } resultArrs.push(flagArr.concat()); while (!isEnd) { leftCnt = 0; for (i = 0; i < m - 1; i++) { if (flagArr[i] == 1 && flagArr[i+1] == 0) { for(j = 0; j < i; j++) { flagArr[j] = j < leftCnt ? 1 : 0; } flagArr[i] = 0; flagArr[i+1] = 1; var aTmp = flagArr.concat(); resultArrs.push(aTmp); if(aTmp.slice(-n).join("").indexOf('0') == -1) { isEnd = true; } break; } flagArr[i] == 1 && leftCnt++; } } return resultArrs; } var abs=getFlagArrs(20, 10); function index(){ var result=[]; for(var j=0;j<abs.length;j++) { for (var i = 0; i < abs[j].length; i++) { if (abs[j][i] == 1) { result.push(i); } } } return result;} function split_array(arr,len){ var a_len=arr.length; var result1=[]; for(var i=0;i<a_len;i+=len){ result1.push(arr.slice(i,i+len)) } return result1; } var s=split_array(index(),10); for(var key in s){ console.log(s[key].join(" ")) } var st2=new Date().getTime() - st;console.log("上面代码的执行时间为"+st2+"毫秒");</script></body></html>
4.找出字符串中最大的单词
代码如下:
function findLongestWord(str) { str=str.split(" "); var j=str[0].length; for(var i=1;i<str.length;i++){ if(j<str[i].length){ j=str[i].length; } } return j; } console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
5.将字符串变为驼峰式,单词首字母大写,其余小写。
代码如下:
function titleCase(str) { str = str.split(' '); for (i = 0; i < str.length; i++) { str[i] = str[i].toLowerCase().split(''); str[i][0] = str[i][0].toUpperCase(); str[i] = str[i].join(''); } return str.join(' '); } console.log(titleCase("i'm a little tea pot"));
5.找出二维数组中,每组数的最大值,并放入一个新集合。
function largestOfFour(arr) { var result = []; for (var i = 0; i < arr.length; i++) { var max = arr[i][0]; for (var j = 1; j < arr[i].length; j++) { if (arr[i][j] > max) { max = arr[i][j]; } } result.push(max); } return result; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])
6.一个函数,删除数组中的值。第一个参数是待删除的数组,其余的参数是待删除的值
代码如下: function destroyer(){
var args=[].slice.call(arguments),arr=args.shift();
for(var i=arr.length-1;i>=0;i--)
args.indexOf(arr[i])!=-1&&arr.splice(i,1);
return console.log(arr);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
7.去除数组中所有的false, null, 0, NaN, undefined, “”(空字符串)
代码如下:
function bouncer(arr) { for (var i= arr.length - 1; i>-1; i--) { (arr[i] == undefined)&&arr.splice(i, 1);//判断一个值等于null或者undefined,是则删除该值 (arr[i]==false)&&arr.splice(i, 1);//判断一个值等于空字符串或者false或者0,是则删除该值 (isNaN(arr[i])&&typeof arr[i]=="number")&&arr.splice(i, 1);//判断一个值全等于NAN,是则删除该值 } return console.log(arr); } bouncer([7, "ate", "", false, 9]); //should return [7, "ate", 9]. bouncer(["a", "b", "c"]); //should return ["a", "b", "c"]. bouncer([false, null, 0, NaN, undefined, ""]); // should return []. bouncer([1, null, NaN, 2, undefined]); //should return [1, 2].
8.函数记忆
//什么是函数记忆: 让函数记住曾经处理过的参数以及参数对应的处理结果 //为什么: 函数本身没有记忆,导致重复计算 //何时: 只要一个函数,可能反复用于计算 //如何: 闭包 //判断一个数是不是质数 function isPrime1(n){ if(n<=3) return true; else if(n%2==0) return false; else{ for(var i=3;i<=Math.sqrt(n);i+=2){ if(n%i==0) return false; } return true; } }var isPrime2=(function(){ var hash={}; return function(n){ if(n<=3) return true; else if(n%2==0) return false; else if(hash[n]!==undefined) return hash[n]; else{ for(var i=3;i<=Math.sqrt(n);i+=2){ if(n%i==0) { hash[n]=false; return false; } } hash[n]=true; return true; } }})();//isPrime2:function(n){...}(hash:{...})for(var i= 0,arr=[];i<1000000;i++){ arr.push( parseInt(Math.random()*1000+9000) );}console.time("isPrime1");for(var i= 0;i<arr.length;i++){ isPrime1(arr[i]);}console.timeEnd("isPrime1");console.time("isPrime2");for(var i= 0;i<arr.length;i++){ isPrime2(arr[i]);}console.timeEnd("isPrime2");
9.快速排序
var arr=[1,2,8,9,5,4,7];function sortArr(arr){ for(var i=1;i<arr.length;i++){ var t=arr[i]; var p=i-1; while(arr[p]>t&&p>=0){ arr[p+1]=arr[p]; p-=1; } arr[p+1]=t; }}sortArr(arr);console.log(arr);
10.数组去重
var arr=[1,2,1,3,2,1,4,3,1,2];function repeat1(arr){ var result=[]; for(var i=0;i<arr.length;i++){ //for(var j=0;j<result.length;j++){ // if(arr[i]==result[j]) // break; //} //if(j==result.length) if(result.indexOf(arr[i])==-1) result.push(arr[i]); } return result;}function repeat2(arr){ var result=[]; var hash={}; for(var i=0;i<arr.length;i++){ if(hash[arr[i]]===undefined){ hash[arr[i]]=1; result.push(arr[i]); } } return result;}function repeat3(arr){ return arr.sort((a,b)=>a-b) .join("") .replace(/(\w)\1*/ig,kw=>kw[0]) .split("");}arr=repeat3(arr);console.log(String(arr));//for(var i= 0,arr=[];i<1000000;i++){// arr.push(// parseInt(Math.random()*9000+1000)// );//}//console.time("repeat1");//repeat1(arr);//console.timeEnd("repeat1");//console.time("repeat2");//repeat2(arr);//console.timeEnd("repeat2");
11.找到排序后的下标
function getIndexToIns(arr, num) { arr.push(num); arr.sort((a,b)=>a-b); for(var i=0;i<arr.length;i++){ if(arr[i]==num){ return (i); } }}getIndexToIns([40, 60], 50);getIndexToIns([10, 20, 30, 40, 50], 35)//should return 3.getIndexToIns([10, 20, 30, 40, 50], 30)//should return 2.getIndexToIns([40, 60], 50)//should return 1.getIndexToIns([3, 10, 5], 3)//should return 0.getIndexToIns([5, 3, 20, 3], 5)//should return 2.getIndexToIns([2, 20, 10], 19)//should return 2.getIndexToIns([2, 5, 10], 15)//should return 3.
12.rot13解码
function rot13(str) { // LBH QVQ VG! var arr = str.toUpperCase().split(" "); var str1 = []; for (var i = 0; i < arr.length; i++) { var arr1 = arr[i].split(""); for (var j = 0; j < arr1.length; j++) { var num = arr1[j].charCodeAt(); if (num >= 65 && num <= 90) { arr1[j] = num + 13 > 90 ? String.fromCharCode(64 + (num + 13 - 90)):String.fromCharCode(num + 13); //64 + (num + 13 - 90) 要明白为什么是64 , } } str1.push(arr1.join("")); } return str1.join(" ");}// Change the inputs below to testconsole.log(rot13("SERR PBQR PNZC"));
13.找出两个数组的不同项
代码如下:
注意:NaN的布尔值是false;
function diffArray(arr1, arr2) { var c=[]; // Same, same; but different. var newArr=arr1.concat(arr2); var o={}; for(var i=0;i<newArr.length;i++){ (newArr[i] in o)? o[newArr[i]]++ : o[newArr[i]] = 1 ; } for (var x in o) if (o[x] == 1) {c.push(x);} for(var i=0;i<c.length;i++){ if(parseInt(c[i])){ c[i]=parseInt(c[i]) } } return c;}
14.阿拉伯数字转成罗马数字
var convertToRoman = function(num) { var decimalValue = [ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 ]; var romanNumeral = [ 'M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I' ]; var romanized = ''; for (var index = 0; index < decimalValue.length; index++) { while (decimalValue[index] <= num) { romanized += romanNumeral[index]; num -= decimalValue[index]; } } return romanized;}convertToRoman (36);
更多函数式编程笔试题,请查看与函数有关面试题(二)………
- 与函数有关面试题(一)
- 与函数有关面试题(二)
- 有关与java初学者的面试题
- 有关字符串中的函数及其部分面试题
- Android面试题-与性能优化相关面试题一
- 另一道与fork()有关的面试题
- 位操作以及与位操作有关的面试题
- 两个与位运算有关的小问题【面试题】
- 有关线程互斥与同步面试题
- C语言面试题---函数(一)
- 常见java考试题与面试题<一>
- php面试题收集与整理(一)
- 常见java考试题与面试题<一>
- php面试题收集与整理(一)
- 有关c#中的面试题
- 有关线程的面试题
- 有关linux内核面试题
- 有关GC的面试题
- hdu6060 RXD and dividing
- 详解 pkg-config 作用
- Django-CBV和FBV
- java.lang.ClassNotFoundException怎么解决
- linux初学者-DDNS配置篇
- 与函数有关面试题(一)
- ClassLoader之热修复
- Python装饰器
- Xamrin.Forms 基础——Behaviors——介绍
- 编译器
- linux中的genewise安装
- Android UI 线程操作
- 特征工程完全总结(Python源码)
- Ignatius and the Princess IV