来源: 吾推网  发布时间: 2023-08-15   次浏览
一、斐波那契数列 (1、1、2、3、5、8、13、21)
方法1:
function test(n){
   if(n<=2){
       return 1;
   }
   return test(n-1)+test(n-2);
}
方法2(迭代法):
function test(n){
  var num1=1;
  var num2=1;
  var num3=0;
  for(var i=0;i<n-2;i++){
      num3=num1+num2;
      num1=num2;
      num2=num3;
  }
  return num3;
}
二、数组排序
方法1(冒泡排序):
function test(arr){
  var len=arr.length;
  for(var i=0;i<len;i++){
       for(var j=0;j<len-i;j++){
           var temp=0;
            if(arr[j]>arr[j+1]){
                 temp=arr[j+1];
                 arr[j+1]=arr[j];
                 arr[j]=temp;
            }
       }
  }
  return arr;
}
方法2(选择排序)
function test(arr){
    if(arr.length==1){return arr}
    var iMin=arr[0];
    var index=0;
    for(var i=0,len=arr.length;i<len;i++){
        if(arr[i]<iMin){
            iMin=arr[i];
            index=i;
         } 
    }
    var minArr=arr.splice(index,1);
    return minArr.concat(test(arr));
}
方法3(快速排序)
function quickSort(arr){
    //如果数组<=1,则直接返回
    if(arr.length<=1){return arr;}
    var pivotIndex=Math.floor(arr.length/2);
    //找基准,并把基准从原数组删除
    var pivot=arr.splice(pivotIndex,1)[0];
    //定义左右数组
    var left=[];
    var right=[];
 
    //比基准小的放在left,比基准大的放在right
    for(var i=0;i<arr.length;i++){
        if(arr[i]<=pivot){
            left.push(arr[i]);
        }
        else{
            right.push(arr[i]);
        }
    }
    //递归
    return quickSort(left).concat([pivot],quickSort(right));
}  
三、写一个字符串转驼峰的算法 如:border-bottom-color =>borderBottomColor
方法1;
function test(str){
    var arr=str.split('-');
    for(var i=1,len=arr.length;i<len;i++){
        arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substring(1);
    }
    return arr.join('');
}
方法2:(正则)
function test(str){
   return str.replace(/-(\w)/g,function($0,$1){
        return $1.toUpperCase();
   })
}
<--------插播解释-------------->
字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。
 
replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。
 
字符 替换文本
$1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$& 与 regexp 相匹配的子串。
$` 位于匹配子串左侧的文本。
$' 位于匹配子串右侧的文本。
$$ 直接量符号。
注意:ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
 
实例
例子 1
在本例中,我们将使用 "W3School" 替换字符串中的 "Microsoft":
 
<script type="text/javascript">
 
var str="Visit Microsoft!"
document.write(str.replace(/Microsoft/, "W3School"))
 
</script>
输出:
 
Visit W3School!
例子 2
在本例中,我们将执行一次全局替换,每当 "Microsoft" 被找到,它就被替换为 "W3School":
 
<script type="text/javascript">
 
var str="Welcome to Microsoft! "
str=str + "We are proud to announce that Microsoft has "
str=str + "one of the largest Web Developers sites in the world."
 
document.write(str.replace(/Microsoft/g, "W3School"))
 
</script>
输出:
 
Welcome to W3School! We are proud to announce that W3School
has one of the largest Web Developers sites in the world.
例子 3
您可以使用本例提供的代码来确保匹配字符串大写字符的正确:
 
text = "javascript Tutorial";
text.replace(/javascript/i, "JavaScript");
例子 4
在本例中,我们将把 "Doe, John" 转换为 "John Doe" 的形式:
 
name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
例子 5
在本例中,我们将把所有的花引号替换为直引号:
 
name = '"a", "b"';
name.replace(/"([^"]*)"/g, "'$1'");
例子 6
在本例中,我们将把字符串中所有单词的首字母都转换为大写:
 
name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
  return word.substring(0,1).toUpperCase()+word.substring(1);}
  );
<--------解释结束-------------->
四、查找字符串中出现最多的字符和个数
方法1:
function test(str){
   var map={};
   for(var i=0,len=str.length;i<len;i++){
       var temp=str.charAt(i);
       if(!map[temp]){
           map[temp]=1;
       }else{
           map[temp]=map[temp]+1;
       }
   }
   
   var max=0;
   var strmax='';
   for(var key in map){
       if(map[key]>max){
           max=map[key]
           strmax=key;
       }
   }
  console.log('出现次数最多的是:'+strmax+'出现'+max+'次');

test('sssfdfsdfsdfsdfsdfsdfsdfgrtertbfdhgdh');
方法2:(正则)
function test(str){
   var max=0;
   var strmax='';
    str=str.split('').sort().join('');
   //\1表示重复前面一个子项
    str.replace(/(\w)\1+/g,function($0,$1){
          if(max<$0.length){
              max=$0.length;
              strmax=$1;
          }
    })
    console.log(出现次数最多的是:'+strmax+'出现'+max+'次');
}
test('sssfdfsdfsdfsdfsdfsdfsdfgrtertbfdhgdh');
五、如何给字符加千分符
var str='423423423432';
function test(str){
var iNum=str.length%3;
var prev='';
var arr=[];
var iNow=0;
var tem='';
var tmp='';
 
if(iNum!=0){
        prev=str.substring(0,iNum);
        arr.push(prev);
}
 
str=str.substring(iNum);
 
for(var i=0;i<str.length;i++){
        iNow++;
        tmp+=str[i];
 
        if(iNow==3&&tmp){
            arr.push(tmp);
            tmp='';
            iNow=0;
        }
}
return arr.join(',');
}
test(str);
方法2:(正则)
var str='423423432';
function test(str){
//匹配不包括开头的后面是以3个数字结尾的可以最少出现一次的边界位置
   var re=/(?=(?!\b)(\d{3})+$)/g;
   return str.replace(re,',');
}
test(str);
<--------插播解释-------------->
此方法用到了正则的两个声明
(?=) //前向声明
(?!) //反前向声明
前向声明表示声明的内容会去做匹配
但是匹配的结果不会对声明的那部分做处理
为了弄清这前向声明
我们来举列说明下
var str='abacad';
var re=/a(?=b)/g;
str=str.replace(re,'*');
console.log(str);//*bacad;
我们是以ab去匹配字符串str的
但是对匹配的结果的ab的处理
我们只处理a而不会处理前向声明过了的b
反前向声明
与前向声明相反
以上面的例子为例
采用反前向声明
则表示我匹配的内容要有a
且a后面可以接一个字符
但是那个字符不能是b
var str='abacad';
var re=/a(?!b)/g;
str=str.replace(re,'*');
console.log(str);//ab*c*d
此方法还用到了\b
表示开始位置、空格或结束
具体定义和用法如下:
\b 元字符匹配单词边界。
 
在单词边界匹配的位置,单词字符后面或前面不与另一个单词字符直接相邻。请注意,匹配的单词边界并不包含在匹配中。换句话说,匹配的单词边界的长度为零。(不要与 [\b] 混淆。)
 
如果未找到匹配,则返回 null。
 
提示:\b 元字符通常用于查找位于单词的开头或结尾的匹配。
 
例子:
/\bm/ 匹配 "moon" 中的 'm';
 
/oo\b/ 不匹配 "moon" 中的 'oo',因为 'oo' 后面的 'n' 是一个单词字符;
 
/oon\b/ 匹配 "moon" 中的 'oon',因为 'oon' 位于字符串的末端,后面没有单词字符;
 
/\w\b\w/ 不匹配任何字符,因为单词字符之后绝不会同时紧跟着非单词字符和单词字符。
<--------解释结束------------->