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实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
Apr 27 Javascript
常用一些Javascript判断函数
Aug 14 Javascript
SWFObject基本用法实例分析
Jul 20 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
Aug 24 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
Dec 19 Javascript
微信小程序 自定义Toast实例代码
Jun 12 Javascript
微信小程序对接七牛云存储的方法
Jul 30 Javascript
浅谈ng-zorro使用心得
Dec 03 Javascript
javascript实现手动点赞效果
Apr 09 Javascript
WebSocket的简单介绍及应用
May 23 Javascript
JS数组扁平化(flat)方法总结详解
Jun 24 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 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
人族 Terran 基本策略
2020/03/14 星际争霸
php上传、管理照片示例
2006/10/09 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
JS 继承实例分析
2008/11/04 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
JavaScript递归函数定义与用法实例分析
2019/01/24 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
Python聚类算法之基本K均值实例详解
2015/11/20 Python
Python守护进程和脚本单例运行详解
2017/01/06 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
python excel和yaml文件的读取封装
2021/01/12 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
python源文件的字符编码知识点详解
2021/03/04 Python
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
研发工程师岗位职责
2014/04/28 职场文书
青春演讲稿范文
2014/05/08 职场文书
新闻编辑求职信
2014/07/13 职场文书
干部个人对照检查材料
2014/08/25 职场文书
学生打架检讨书
2014/10/20 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python