您的位置:首页 > Web前端 > JavaScript

W3Cschool初级脚本算法难题解析——JS对数组和字符串的常见操作

2019-04-26 22:02 495 查看

最近无聊刷了一波W3Cschool上的前端课程,三天获得了前端基础编程实战课程通关证书(共226关)因为本科毕业设计做过前端所以比较容易完成。但对脚本算法是一窍不通,今天花了一点时间做了脚本算法编程实战课程的初级脚本算法。遇到了一些难点,不过有幸逐一解决了,每当解决一个算法的时候,感觉整个心情都舒畅起来。闲话结束,进入实战。

 算法:1.寻找最长的单词

实验要求:返回提供的句子中最长的单词长度,返回值应该是一个数字。

[code]function findLongestWord(str) {
shuzu=str.split(' ');//字符串转数组
var max=0;
for(var i=0;i<shuzu.length;i++)
{
shuzu[i]=shuzu[i].split('');//数组每个元素中的字符串也转为数组形式
}
for(var j=0;j<shuzu.length;j++)
{
if(shuzu[j].length>max){
max=shuzu[j].length;//取最长数组,返回其长度
}
}

return max;
}

findLongestWord("The quick brown fox jumped over the lazy dog");

本人写算法没什么章程,时间复杂度的暂时考虑不到,变量命名也毫无章法,还是个小菜鸟一枚。

上述的程度输出结果为 6 ,即最大字符串的长度为6(对应jumped)

算法:2. 设置首字母大写

要求:返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写。

[code]function titleCase(str) {
str=str.toLowerCase();//将所有大写字符转为小写字符,这样后面只需对每个字符串的首个字符进行大写。
shuzu=str.split(' ');//字符串转数组,为了提取单个字符串
for(var i=0;i<shuzu.length;i++){
shuzu[i]=shuzu[i].split('');//字符串转数组,为了提取单个字符
shuzu[i][0]=shuzu[i][0].toUpperCase();//将首字符大写
shuzu[i]=shuzu[i].join('');//将修改好字符串转数组

}
str=shuzu.join(' ');//将数组转为字符串
return str;
}

titleCase("I'm a little tea pot");

此程序输出结果为:I'm A Little Tea Pot

算法:3.寻找数组中最大值

要求:分别找到每个小数组中的最大值,将其串联为新的数组并输出。

[code]function largestOfFour(arr) {
// You can do this!
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++)
{
if(arr[i][0]<arr[i][j])
arr[i][0]=arr[i][j];
}//遍历每个小数组,将小数组第一个元素存放这个小数组中最大的元素
}
for(var k=0;k<arr.length;k++){
arr[k]=arr[k][0];//将所有的小数组第一个元素存放在一起
}
return arr;
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

输出结果:[5,27,39,1001] 

算法:4.确认末尾字符 

要求:检查一个字符串(str)是否以指定的字符串(target)结尾;

如果是,返回true,否则,返回false。

[code]function confirmEnding(str, target) {
// "Never give up and good luck will find you."
// -- Falcor
target=target.split('');//将字符串转为数组,方便用数组下标进行元素的比较
var length=target.length;
str=str.split('');//同上
var num=0;
for(var i=str.length-length,j=0;i<str.length,j<target.length;i++,j++)
{
if(str[i]===target[j])//待比较的字符串从末尾倒数的相应位置与target进行一一比较
num+=1;//如果对应元素相等,就设标记+1
}
if (num==target.length)
return true;//如果相等的个数等于目标的个数则为真
return false;
}

confirmEnding("Bastian", "n");

 返回值为 true

写到这个算法其实我就有点放弃了,休息了一会,看点剧在来做就又思想了。就像此算法的默认备注,加油把。

 算法:5.去除数组中任意多个值

要求:实现一个destroyer函数,第一个参数是初始数组,后跟一个或多个参数。从初始数组中删除与这些参数具有相同值的所有元素。

[code]function destroyer(arr) {
// Remove all the values
for(var i=1;i<arguments.length;i++)//外循环控制形参数
{
for (var j=0;j<arguments[0].length;j++)//内循环控制数组arr值
{
if(arguments[0][j]==arguments[i])
{
arr.splice(j,1);
j--;
}
}
}
return arguments[0];
}

destroyer([3,5,1,2,2], 2, 3, 5);

 输出为[1]

因为算法太多了,中间我认为简单的就不写上来了

 算法:6.数组排序并插入值

要求:先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引。

如 where([1,2,3,4],1.5) 返回1

[code]function where(arr, num) {
// Find my place in this sorted array.
var num2=0;
for(var i=0;i<arr.length;i++)
for(var j=0;j<arr.length;j++)
{
if(arr[j]>arr[j+1])
{
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}/*给的提示说可以用数组的sort()排序方法,可是并不能使用,因此在实现直接用了冒泡排序算法,对数组进行了从大到小的排序*/
for(var k=0;k<arr.length;k++)
{
if(arr[k]<num&&arr[k+1]>=num)
{
num2=k+1;
}//找到目标值num对应的位置

}
if(arr[arr.length-1]<num)
num2=arr.length;//要是该值在数组末尾,则单独为其加1

return num2;
}

where([2,10,15], 19);

输出结果为: 3 

 算法:7.位移密码

要求:移位密码就是密码中的字母会按照指定的数量来做移位。

写一个ROT13函数,字母会移位13个。

编写一个ROT13函数,实现输入加密字符串,输出解密字符串。

注意:所有的字母都是大写,不要转化任何非字母形式的字符(例如:空格,标点符号),遇到这些特殊字符,就跳过它们。

[code]function rot13(str) { // LBH QVQ VG!
var arr="";
var arr2="";
arr=str.split('');
for(var i=0;i<arr.length;i++)
{
arr[i]=str.charCodeAt(i);
if(arr[i]>=65&&arr[i]<=77)
{arr[i]=arr[i]+13;}
else if(arr[i]>77&&arr[i]<=90)
{
arr[i]=(arr[i]+13)%90+64;
}//对移除了Z的字母,超出的部分从A开始计算

arr[i]=String.fromCharCode(arr[i]);//将改变后的ASCII码转为字符
}

str=arr.join('');//将数组转为字符
return str;//输出解密后的字符串
}
rot13("SERR PBQR PNZC");

 输出为:FREE CODE CAMP

事实证明,真正学代码还是靠实战,不管你之前看了多少教学视频,买了多少辅导书,都不如自己动手来的快。感觉这两天编程思维能力突飞猛进啊。加油吧。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: