高级脚本算法挑战

地址:https://www.w3cschool.cn/codecamp/list?pename=advanced_algorithm_scripting_camp

判断电话号码算法挑战:
如果传入字符串是一个有效的美国电话号码,则返回 true.
用户可以在表单中填入一个任意有效美国电话号码. 下面是一些有效号码的例子(还有下面测试时用到的一些变体写法):
555-555-5555
(555)555-5555
(555) 555-5555
555 555 5555
5555555555
1 555 555 5555
在本节中你会看见如 800-692-7753 or 8oo-six427676;laskdjf这样的字符串. 你的任务就是验证前面给出的字符串是否是有效的美国电话号码. 区号是必须有的. 如果字符串中给出了国家代码, 你必须验证其是 1.如果号码有效就返回 true ; 否则返回 false.

function telephoneCheck(str) {
    return /^1?\s?(\(\d{3}\)|\d{3})[-|\s]*\d{3}[-|\s]*\d{4}$/.test(str);
    //return /^1? ?(\d{3}|\(\d{3}\))[ -]?\d{3}[ -]?\d{4}$/.test(str);
}
telephoneCheck("555-555-5555");

集合交集算法挑战:
创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组.
给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2, 3, 4}), 而数学术语 "对等差分" 的集合就是指由所有只在两个集合其中之一的元素组成的集合(A △ B = C = {1, 4}). 对于传入的额外集合 (如 D = {2, 3}), 你应该安装前面原则求前两个集合的结果与新集合的对等差分集合 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).

function sym(result,...args) {
    for(let i=0,j=args.length;i<j;i++)
    {
        result = result.filter(a=>args[i].indexOf(a)<0).concat(args[i].filter(a=>result.indexOf(a)<0));
        result = [...new Set(result)];
    }
    return result;
}

sym([1, 2, 3], [5, 2, 1, 4]);

收银系统算法挑战:
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数.
cid 是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed".
否者, 返回应找回的零钱列表,且由大到小存在二维数组中.

function checkCashRegister(price, cash, cid) {
    //排序
    //cid.sort(function(a,b){ return b[1]-a[1]});
    //求和
    let sum = 100 * cid.reduce(function(a,b){ return Array.isArray(a)?a[1]+b[1]:a+b[1];})
    let diff =100 * (cash - price);
    if(sum > diff)
    {
        let result = [];
        let num = 0;
        let initMoney = 100 * cid[8][1];
        let outMoney = 0;
        while(diff>=10000)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 10000;
           diff -= 10000;
           initMoney -=10000;
        }
        if(num>0)
        {
            result.push(["ONE HUNDRED",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[7][1];
        outMoney = 0;
        while(diff>=2000)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 2000;
           diff -= 2000;
           initMoney -=2000;
        }
        if(num>0)
        {
            result.push(["TWENTY",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[6][1];
        outMoney = 0;
        while(diff>=1000)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 1000;
           diff -= 1000;
           initMoney -=1000;
        }
        if(num>0)
        {
            result.push(["TEN",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[5][1];
        outMoney = 0;
        while(diff>=500)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 500;
           diff -= 500;
           initMoney -=500;
        }
        if(num>0)
        {
            result.push(["FIVE",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[4][1];
        outMoney = 0;
        while(diff>=100)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 100;
           diff -= 100;
           initMoney -=100;
        }
        if(num>0)
        {
            result.push(["ONE",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[3][1];
        outMoney = 0;
        while(diff>= 25)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 25;
           diff -= 25;
           initMoney -= 25;
        }
        if(num>0)
        {
            result.push(["QUARTER",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[2][1];
        outMoney = 0;
        while(diff>=10)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 10;
           diff -= 10;
           initMoney -= 10;
        }
        if(num>0)
        {
            result.push(["DIME",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[1][1];
        outMoney = 0;
        while(diff>=5)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 5;
           diff -= 5;
           initMoney -= 5;
        }
        if(num>0)
        {
            result.push(["NICKEL",Number(outMoney/100)]);
        }

        num = 0;
        initMoney = 100 * cid[0][1];
        outMoney = 0;
        while(diff>=1)
        {
           if(initMoney<=0)
           {
               break;
           }
           num++;
           outMoney += 1;
           diff -= 1;
           initMoney -=1;
        }
        console.log(diff);
        if(num>0)
        {
            result.push(["PENNY",Number(outMoney/100)]);
        }

        if(diff>0)
        {
             return "Insufficient Funds";
        }
        return result;
    }
    else if(sum == diff){
        return "Closed";
    }
    else
    {
        return "Insufficient Funds";
    }

}

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);

库存更新算法挑战:
依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物名称的字母顺序排列.

function updateInventory(arr1, arr2) {
    let result = arr2;
    if(arr2.length == 0)
    {
        return arr1;
    }
    let arr = [];
    arr2.reduce(function(a,b){if(a!=undefined){arr.push(a[1]);}arr.push(b[1]);});
    for(let i = 0 ,j=arr1.length;i<j;i++)
    {
        var index = arr.indexOf(arr1[i][1]);
        if ( index < 0 )
        {
            result.push(arr1[i]);
        }
        else
        {

            result = result.slice(0,index).concat([[result.slice(index,index+1)[0][0]+arr1[i][0],result.slice(index,index+1)[0][1]]]).concat(result.slice(index+1,result.length));
        }
    }
    result.sort(function(a,b){return b[1]<a[1]});
    console.log(result);
    return result;
}

// Example inventory lists
var curInv = [
[21, "Bowling Ball"],
[2, "Dirty Sock"],
[1, "Hair Pin"],
[5, "Microphone"]
];

var newInv = [
[2, "Hair Pin"],
[3, "Half-Eaten Apple"],
[67, "Bowling Ball"],
[7, "Toothpaste"]
];

updateInventory(curInv, newInv);

原文地址:https://www.cnblogs.com/miaosj/p/10900957.html

时间: 2024-10-19 04:26:29

高级脚本算法挑战的相关文章

【2018-11-14】初级脚本算法挑战

1.翻转字符串算法 1 function reverseString(str) { 2 var res=str.split("").reverse().join(""); 3 return res; 4 } 5 reverseString("hello"); 2.阶乘算法 1 function factorialize(num) { 2 var res=1; 3 for(;num>0;num--) 4 { 5 res*=num; 6 } 7

数据结构之高级排序算法

一.希尔排序 希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量. 具体代码实现: 1 package data.struct.algorithm; 2 3 //高级排序算法之希尔排序 4 class

javascript数据结构与算法--高级排序算法

高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法---- 希尔排序和快速排序. 一:希尔排序: 希尔排序的核心理念是:首先比较距离较远的元素,而非相邻的元素. 基本原理:通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔. 下面我们来看看数组[0,9,1,8,7,6,2,3,5,4] 来使用希尔排序的原理:如下图: 代码分析如下: 1. 执行 "间隔序列=3的步骤" A.

RX学习笔记:FreeCodeCamp的JavaScript基本算法挑战

FreeCodeCamp的JavaScript基本算法挑战 https://www.freecodecamp.com 2016-07-03 JavaScript还不是非常熟悉,用已经会的知识来解这些题,估计有些算法会非常笨. 1.反转字符串 str.split("").reverse().join(""); 2.阶乘(阶乘0的结果需为1) function factorialize(num) { var n=1; for(var i=num;i>0;i--){

javascript算法挑战

1.翻转字符串算法挑战: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 function reverseString(str) { arr = str.split(''); str = arr.reverse().join(''); return str; } reverseString("hello"); 2.阶乘算法挑战: 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成

js初级脚本算法

原文链接 翻转字符串算法挑战 function reverseString(str){ str = str.split('').reverse().join(''); return str; } reverseString("hello"); 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串 阶乘算法 function factorialize(num){ var b = 1; for( var i=1;i<=num;i++){ b = i

高级排序算法之快速排序

快速排序是一个高级排序算法,算法核心思想:确定每一个值的正确位置,即该值左边为小,右边为大即可 这个算法实现上面也是需要经过递归,一般取第一个值开始进行排序 当然也有特别需要注意的地方 设 需要找正确位置的值 定义为 arr[ l ]  = v; 此时需要比较 值 e 与 v 的关系,无非两种(三种即多一个等于) 若e > v ,则无话可说,无需移动,继续移动游标比较arr[ i + 1]  与 v 的大小 若 e < v,则需要交换  e  和 arr [ j + 1 ] 的值,并需要将 j

高级排序算法之归并排序

在自己摸爬滚打前行或是后退的时候,总会出现很多的惊喜或意外 楼主大三狗,前些天异想天开想面试青少年编程老师一职 没想到对面坐的是科大讯飞十年辞职创业的高级攻城狮... 很尬,未果.我说了近况,并没有潜心研究算法云云,一直在入门机器学习,深度学习 他说本科生在没有能力的情况下不要研究这些--最好学学算法,以后出来找工作肯定是不成问题的.. 前言背景有点长,下面正式开始 归并排序是一种高效率的算法,时间复杂度只有O(nlogn) 它的核心思想是分治策略 如下图,分是将其二分至不可再分 分完需要再合,

bash-shell-scripts高级脚本配置IP地址

[[email protected] shell]# cat mod_ip_hostname.sh  #!/bin/bash #Auto modify ip and hostname #by colin on 2015-05-07 IP_CONFIG='/etc/sysconfig/network-scripts/ifcfg-eth0' HOSTNAME_CONFIG='/etc/sysconfig/network' HOSTS_CONFIG='/etc/hosts' #定义一个IP主要内容数组