来源: 吾推网
发布时间: 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:(正则)
方法2:(正则)
var str='423423432';
function test(str){
//匹配不包括开头的后面是以3个数字结尾的可以最少出现一次的边界位置
//匹配不包括开头的后面是以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);//*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 元字符匹配单词边界。
在单词边界匹配的位置,单词字符后面或前面不与另一个单词字符直接相邻。请注意,匹配的单词边界并不包含在匹配中。换句话说,匹配的单词边界的长度为零。(不要与 [\b] 混淆。)
如果未找到匹配,则返回 null。
提示:\b 元字符通常用于查找位于单词的开头或结尾的匹配。
例子:
/\bm/ 匹配 "moon" 中的 'm';
/oo\b/ 不匹配 "moon" 中的 'oo',因为 'oo' 后面的 'n' 是一个单词字符;
/oon\b/ 匹配 "moon" 中的 'oon',因为 'oon' 位于字符串的末端,后面没有单词字符;
/\w\b\w/ 不匹配任何字符,因为单词字符之后绝不会同时紧跟着非单词字符和单词字符。
<--------解释结束------------->
<--------解释结束------------->