- 如何将字符串进行反转
解题思路:字符串本身没有反转方法,先将字符串转为数组,再用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 test
console.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);
更多函数式编程笔试题,请查看与函数有关面试题(二)………