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的三级展开列表
Apr 26 Javascript
Jquery进度条插件 Progress Bar小问题解决
Jul 12 Javascript
JS等比例缩小图片尺寸的实例
Feb 27 Javascript
Javascript实现简单二级下拉菜单实例
Jun 15 Javascript
jQuery中的jQuery()方法用法分析
Dec 27 Javascript
js读取csv文件并使用json显示出来
Jan 09 Javascript
浅谈javascript原型链与继承
Jul 13 Javascript
Bootstrap每天必学之表单
Nov 23 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
Aug 19 Javascript
使用cookie绕过验证码登录的实现代码
Oct 12 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
javascript for循环性能测试示例
Aug 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
php连接数据库代码应用分析
2011/05/29 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
php显示页码分页类的封装
2017/06/08 PHP
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
JavaScript 字符编码规则
2009/05/04 Javascript
Javascript Math对象
2009/08/13 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
js实现微信分享代码
2020/10/11 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
python读文件逐行处理的示例代码分享
2013/12/27 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
如何在python中实现随机选择
2019/11/02 Python
PyTorch中permute的用法详解
2019/12/30 Python
python标准库os库的函数介绍
2020/02/12 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
2014教师党员自我评议总结
2014/09/19 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
初三数学教学反思
2016/02/17 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis