w3c编程挑战_初级脚本算法实战篇


Posted in Javascript onJune 23, 2017

之前偶然看到了w3c上的编程挑战题,就像拿来试试手,先做的是初级脚本算法,总体不难,如果有更好的方法,希望能一起交流!

1、翻转字符串

先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串。

function reverseString(str) {
      var str2 = '';
      for(var i=str.length-1;i>=0;i--){
        str2 += str[i];
      }
      return str2;
    }

    function reverseString(str){
      var strArray = str.split('');
      strArray.reverse();
      str = strArray.join('');
      return str
    }

2、计算一个整数的阶乘

如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。

function factorialize(num) {
      var sum = 1;

      for(var i=num;i>0;i--){
        sum *= i;
      }

      console.log(sum);
      return sum;
    }


    function factorialize(num) {

      if(num ==1){
        return 1;
      }else{
        return arguments.callee(num-1)*num;
      }

    }

3、回文算法

如果给定的字符串是回文,返回true,反之,返回false。

如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。

function palindrome(str) {
        var arr = [];
        str = str.toLowerCase();
        
        for(var i=0;i<str.length;i++){
          // 在小写字母的Unicode的范围内或者在数字的Unicode范围内
          if((str.charCodeAt(i)<=122 && str.charCodeAt(i)>=97) || 
          (str.charCodeAt(i)<=57 && str.charCodeAt(i)>=48)){
            arr.push(str[i]);
          }
        }

        //只需要判断数组一半的次数就全部比较完了,不必再浪费时间了
        for(var i=0;i<Math.ceil(arr.length/2);i++) {
          if(arr[i] !== arr[arr.length-i-1]){
            return false;
          }
        }
        return true;
        
      }



      // 需要手动添加特殊字符
      function palindrome(str){
        var str1,str2;
        str = str.toLowerCase();
        str = str.replace(/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?]/g,"");

        str1 = str.split('');
        str1.reverse();
        str2 = str1.join('');
        if(str === str2){
          return true
        }else{
          return false;
        }


      }

4、寻找最长的单词算法

找到提供的句子中最长的单词,并计算它的长度。

函数的返回值应该是一个数字。

// 利用charCodeAt()方法判断是不是一个单词,并记录单词长度,最后获得最长的单词长度
    function findLongestWord(str) {

      var num = 0,
        max = 0;

      for (var i = 0; i < str.length; i++) {
        if (str.charCodeAt(i) !== 32) {
          num++;
        } else {
          // 注意:如果最后一个字母不是空格,不会比较最后一个单词的长度
          max = num > max ? num : max;
          num = 0;
        }
      }
      // 比较最后一个单词的长度
      max = num > max ? num : max;
      return max;
    }


    // 利用split()方法将字符串分成每个单词组成的数组,取得其中最长的长度
    function findLongestWord(str){

      var max = 0;
      var arr = str.split(' ');
      for(var i=0;i<arr.length;i++){
        max = arr[i].length>max?arr[i].length:max;
      }
      return max;

    }

5、设置首字母大写算法

确保字符串的每个单词首字母都大写,其余部分小写。

像'the'和'of'这样的连接符同理。

//将字符串用split()方法转为数组,并用数组中的每个项的首字母的大写和这个项剩余的字符拼接,最后转为字符串
    function titleCase(str) {

      var arr,upChar;
      str = str.toLowerCase();
      arr = str.split(' ');
      
      for(var i=0;i<arr.length;i++){
        upChar = arr[i][0].toUpperCase() ;
        arr[i] = upChar + arr[i].slice(1);
      }

      arr = arr.join(' ');

      return arr;
    }

    function titleCase(str){
      var upChar,
        toUper = false;
      for(var i=0;i<str.length;i++){
        if((str.charCodeAt(i) == 32)){
          toUper = true;
        }else if(toUper){
          upChar= str[i].toUpperCase();
          console.log(upChar)
          console.log(str[i]);
          str[i] = upChar;
          toUper = false;
        }
      }
      return str;
    }

6、寻找数组中的最大值算法

右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。

function largestOfFour(arr) {
      var max = 0,
        result = [];

      for(var i=0;i<arr.length;i++){
        for(var j=0;j<arr[i].length;j++){
          var n = arr[i][j];
          max = n>max?n:max;
        }
        result.push(max);
        max = 0;
      }

      return result;
    }

7、确认末尾字符算法

检查一个字符串(str)是否以指定的字符串(target)结尾。

如果是,返回true;如果不是,返回false。

// 从后开始比较
    function confirmEnding(str, target) {
      for (var i = 0; i < target.length; i++) {
        if (str[str.length - 1 - i] != target[target.length - 1 - i]) {
          return false;
        }
      }
      return true;
    }

8、重复操作算法

重要的事情说3遍!

重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。

function repeat(str, num) {
      var result = '';
      if(num<0){
        return '';
      }else{
        for(var i=0;i<num;i++){
          result += str;
        }
      }
      return result;
    }

9、字符串截取算法

用瑞兹来截断对面的退路!

截断一个字符串!

如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。

切记,插入到字符串尾部的三个点号也会计入字符串的长度。

但是,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

function truncate(str, num) {
      var result = '';
      var strArr = str.split('');
      if(num<=3){
        result = str.slice(0,num) +'...';
      }else if(str.length>num){
        result = str.slice(0,num-3) + '...';
      }else{
        result = str;
      }
      return result;
    }

10、数组分割算法

猴子吃香蕉可是掰成好几段来吃哦!

把一个数组arr按照指定的数组大小size分割成若干个数组块。

function chunk(arr, size) {
      var result = [];
      var a = [];
      for(var i=0;i<arr.length;i++){
        a.push(arr[i]);
        if( ((i+1)%size == 0) || (i == arr.length-1)){
          result.push(a);
          
          a = [];
        }
      }
      return result;
    }

11、数组截断算法

打不死的小强!

返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。

function slasher(arr, howMany) {
      var result = [];
      for(var i=howMany;i<arr.length;i++){
        result.push(arr[i]);
      }
      return result;
    }

12、数组查询算法

蛤蟆可以吃队友,也可以吃对手。

如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。

["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。

["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。

function mutation(arr) {
    var arr1 = arr[0].toLowerCase();
    console.log(arr1)
    var arr2 = arr[1].toLowerCase();

    for(var i=0;i<arr[1].length;i++){
              
      if(arr1.indexOf(arr2[i]) == -1){
        return false;
      }
    }

    return true;
  }

13、删除数组中特定值

真假美猴王!

删除数组中的所有假值。

在JavaScript中,假值有false、null、0、""、undefined 和 NaN。

function bouncer(arr) {
    // Don't show a false ID to this bouncer.
      for(var i=0;i<arr.length;i++){
        if(!arr[i] == true){
          arr.splice(i,1);
          i--;
        }
      }

      return arr;
    }

14、去除数组中任意多个值

金克斯的迫击炮!

实现一个摧毁(destroyer)函数,第一个参数是待摧毁的数组,其余的参数是待摧毁的值。

function destroyer(arr) {
      // Remove all the values
      var arr = arguments[0];
      console.log(arr[1]);
      var data = Array.prototype.slice.call(arguments,1);
      for(var j=0;j<data.length;j++){
        for(var i=0;i<arr.length;i++){
          if(arr[i] == data[j]){
            arr.splice(i,1);
            i--;
          }
        }
      }
      return arr;
    }

15、数组排序并插入值

我身在何处?

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

举例:where([1,2,3,4], 1.5) 应该返回 1。因为1.5插入到数组[1,2,3,4]后变成[1,1.5,2,3,4],而1.5对应的索引值就是1。

同理,where([20,3,5], 19) 应该返回 2。因为数组会先排序为 [3,5,20],19插入到数组[3,5,20]后变成[3,5,19,20],而19对应的索引值就是2。

function where(arr, num) {
      arr.sort(function(a,b){
        return a - b;
      });

      for(var i=0;i<arr.length;i++){
        if(num > arr[i] && num < arr[i+1]){
          return i+1;
        }else if(num == arr[i]){
          return i;
        }else if(num >arr[arr.length-1]){
          return arr.length;
        }

      }

    }

16、位移密码算法

让上帝的归上帝,凯撒的归凯撒。

下面我们来介绍风靡全球的凯撒密码Caesar cipher,又叫移位密码。

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

一个常见的案例就是ROT13密码,字母会移位13个位置。由'A' ↔ 'N', 'B' ↔'O',以此类推。

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

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

function rot13(str) { // LBH QVQ VG!
        var result = [];
        for(var i=0;i<str.length;i++){
          if(str.charCodeAt(i) >= 65 && str.charCodeAt(i) <= 90){
            var code = str.charCodeAt(i) + 13;
            if(code>90){
              code = str.charCodeAt(i) + 13 - 26;
            }
            
            result.push(String.fromCharCode(code));
          }else{
            result.push(str[i]);
          }
        }
        return result.join("");
      }

以上这篇w3c编程挑战_初级脚本算法实战篇就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery高效反选具体实现
May 05 Javascript
js控制不同的时间段显示不同的css样式的实例代码
Nov 04 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
搭建pomelo 开发环境
Jun 24 Javascript
JS 获取鼠标左右键的键值方法
Oct 11 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
JS判断字符串字节数并截取长度的方法
Mar 05 Javascript
微信小程序组件 marquee实例详解
Jun 23 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
Nov 15 Javascript
详解webpack提取第三方库的正确姿势
Dec 22 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
echarts统计x轴区间的数值实例代码详解
Jul 07 Javascript
微信小程序 获取二维码实例详解
Jun 23 #Javascript
详谈表单格式化插件jquery.serializeJSON
Jun 23 #jQuery
angularJs的ng-class切换class
Jun 23 #Javascript
关于使用js算总价的问题
Jun 23 #Javascript
angular select 默认值设置方法
Jun 23 #Javascript
获取当前按钮或者html的ID名称实例(推荐)
Jun 23 #Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 #Javascript
You might like
晶体管单管来复再生式收音机
2021/03/02 无线电
ADODB类使用
2006/11/25 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
使用python绘制常用的图表
2016/08/27 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
Python 解析简单的XML数据
2020/07/24 Python
一个入门级python爬虫教程详解
2021/01/27 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
JS原生实现轮播图的几种方法
2021/03/23 Javascript
函授本科毕业自我鉴定
2013/10/09 职场文书
幼儿园秋游活动方案
2014/01/21 职场文书
人事经理岗位职责
2014/04/28 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
护理工作个人总结
2015/03/03 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
志愿服务心得体会
2016/01/15 职场文书
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电