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 相关文章推荐
在javascript将NodeList作为Array数组处理的方法
Jul 09 Javascript
简单选项卡 js和jquery制作方法分享
Feb 26 Javascript
node.js不得不说的12点内容
Jul 14 Javascript
jQuery实现购物车计算价格功能的方法
Mar 25 Javascript
JavaScript使用Replace进行字符串替换的方法
Apr 14 Javascript
jquery采用oop模式class类的使用示例
Jan 22 Javascript
Node.js使用MySQL连接池的方法实例
Feb 11 Javascript
常用的 JS 排序算法 整理版
Apr 05 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
详解使用create-react-app添加css modules、sasss和antd
Jul 31 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 Javascript
vue中watch和computed的区别与使用方法
Aug 23 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
PHP中提问频率最高的11个面试题和答案
2014/09/02 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
Yii2如何批量添加数据
2016/05/17 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
脚本收藏iframe
2006/07/21 Javascript
javascript的事件描述
2006/09/08 Javascript
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
JavaScript中的Document文档对象
2008/01/16 Javascript
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
2011/07/04 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
Python基于有道实现英汉字典功能
2015/07/25 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
学前班教师的自我鉴定
2013/12/05 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
会计工作决心书
2014/03/11 职场文书
六一晚会主持词开场白
2015/05/28 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python