閱讀350 返回首頁    go 財經資訊


js高級腳本算法

判斷電話號碼算法

function telephoneCheck(str) {  
    var re=/^[1-9]\d{9}$|^[1-9]\d{2}-[0-9]\d{2}-[0-9]\d{3}$|^\([1-9]\d{2}\)[0-9]\d{2}-[0-9]\d{3}$|^\([1-9]\d{2}\)\s[0-9]\d{2}-[0-9]\d{3}$|^[1-9]\d{2}\s[0-9]\d{2}\s[0-9]\d{3}$|^[1]\s[0-9]\d{2}\s[0-9]\d{2}\s[0-9]\d{3}$|^[1]\s[0-9]\d{2}-[0-9]\d{2}-[0-9]\d{3}$|^[1]\s\([0-9]\d{2}\)\s[0-9]\d{2}-[0-9]\d{3}$|^[1]\([0-9]\d{2}\)[0-9]\d{2}-[0-9]\d{3}$/g;
    if(str.match(re)){
        return true;
    }else{
        return false;
    }
}
telephoneCheck("555-555-5555");

如果傳入字符串是一個有效的美國電話號碼,則返回 true。用戶可以在表單中填入一個任意有效美國電話號碼。下麵是一些有效號碼的例子(還有下麵測試時用到的一些變體寫法):

555-555-5555
(555)555-5555
(555) 555-5555
555 555 5555
5555555555
1 555 555 5555

本節的任務就是驗證前麵給出的字符串是否是有效的美國電話號碼. 區號是必須有的. 如果字符串中給出了國家代碼, 你必須驗證其是 1.如果號碼有效就返回 true ; 否則返回 false.

集合交集算法

function sym(args) {
    var temp,pos;
    var a=Array.from(arguments); //Array.from() 方法從一個類似數組或可迭代的對象中創建一個新的數組實例
    a=a.reduce(function(prev, curv, index, array){  //arr.reduce參數:callback:執行數組中每個值的函數,包含四個參數:accumulator:上一次調用回調返回的值,或者是提供的初始值(initialValue)。currentValue:數組中正在處理的元素。currentIndex:數據中正在處理的元素索引,如果提供了 initialValue ,從0開始;否則從1開始。array:調用 reduce 的數組,initialValue:可選項,其值用於第一次調用 callback 的第一個參數。如果沒有設置初始值,則將數組中的第一個元素作為初始值。空數組調用reduce時沒有設置初始值將會報錯
        var a = prev.filter(function(item){
            return curv.indexOf(item) < 0;
         });
        var b = curv.filter(function(item){
            return prev.indexOf(item) < 0;
         });
        return a.concat(b);
     });
     return a.filter(function(item,index,array){
         return array.indexOf(item) == index;
      }); 
}
sym([1, 2, 3], [5, 2, 1, 4]);

創建一個函數,接受兩個或多個數組,返回所給數組的對等差分(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 checkCashRegister(price, cash, cid) {
    var change;
     var base=100;//金額基數
    change=(cash-price)*base; //找零
    var getTotalMoney=function(arr){   //定義一個函數,用來求零錢和
         var s=arr.reduce(function (preV, currV, currIndex, array){
             return preV+currV[1];
        },0); 
        return base*s;      
    };
    var remain = getTotalMoney(cid);
    if(remain < change){//餘額不足,沒錢找了
        return "Insufficient Funds";
     }
    var baseDollarObj={
        "PENNY":1,
        "NICKEL":5,
        "DIME":10,
        "QUARTER":25,
         "ONE":100,
         "FIVE":500,
        "TEN":1000,
        "TWENTY":2000,
        "ONE HUNDRED":10000
    };
        var changeArr=[];
    var currLast=0;// 當前麵值所剩餘額
    var currMoney=0;//當前金錢麵額
    var currtotal=0;//當前零錢可找總額
    for (var i=cid.length-1;i>=0;i--){
        currLast=cid[i][1]*base;    //當前麵值剩餘金額  
        if (currLast<=0) { 
            continue;//當前麵值的金額剩餘0,跳過
        }
        currMoney=baseDollarObj[cid[i][0]];
        if(change>currMoney){//如果當前金額麵值小於應找錢數         
        if(change<currLast){
            currtotal=currMoney*Math.floor(change/currMoney);          
        }else{
            currtotal=currLast;
         }
        change-=currtotal; //取完之後從應找餘額中減去(張數x麵值) 
        changeArr.push([cid[i][0],currtotal/base]);
    }}

    if(change>0){
        return "Insufficient Funds";//找不開的麵值
    }else if(change===0&&((cash-price)*base==remain)){
        return "Closed";  //如果零錢數等於應找數額並且可找出來
    }else{
        return changeArr;
    }
}
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]]);

設計一個收銀程序 checkCashRegister() ,其把購買價格(price)作為第一個參數 , 付款金額 (cash)作為第二個參數, 和收銀機中零錢 (cid) 作為第三個參數。cid 是一個二維數組,存著當前可用的找零。當收銀機中的錢不夠找零時返回字符串 "Insufficient Funds". 如果正好則返回字符串 "Closed"。否者, 返回應找回的零錢列表,且由大到小存在二維數組中

庫存更新算法

function updateInventory(arr1, arr2) {
    arr2=arr2.filter(function(v){
        var res = true;
         for(var i = 0;i < arr1.length;i++){
            if(v[1] === arr1[i][1]){
                arr1[i][0] = arr1[i][0] + v[0];
                res= false;
                break;
            }
         }
        return res;
     });
    arr1 = arr1.concat(arr2);
    arr1.sort(function(a,b){
        return a[1].charCodeAt(0) - b[1].charCodeAt(0);
    });
    return arr1;    
}

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);

依照一個存著新進貨物的二維數組,更新存著現有庫存(在 arr1 中)的二維數組. 如果貨物已存在則更新數量 . 如果沒有對應貨物則把其加入到數組中,更新最新的數量. 返回當前的庫存數組,且按貨物名稱的字母順序排列

排列組合去重算法

function permAlone(str) {
    var reg = /(.)1+/g;//創建正則,如果字符串全重複,則直接return 0
    if (str.match(reg) !== null && str.match(reg)[0] === str) {
        return 0;
    }
    function recoper(str) {
        var arr = [];//存放str的全排列
        if (str.length > 1) {
            var left = str[0];
            var rest = str.slice(1, str.length);
             var perRes = recoper(rest); //獲取rest字符串的全排列
            var pl = perRes.length,
            pil, s;
            for (var i = 0; i < pl; i++) {
                s = perRes[i];
                pil = perRes[i].length;
                for (var j = 0; j <=pil; j++) {
                    var tmp = s.substring(0, j) + left + s.substring(j, pl);
                    arr.push(tmp);
                }
            }
        } else if (str.length == 1) {
            arr = [str];
        }
        return arr;
    }
    perarr=recoper(str);
     return perarr.filter(function(val) {//返回相鄰不重複的數量
        return !val.match(reg);
    }).length;
}
permAlone('aab');

把一個字符串中的字符重新排列生成新的字符串,返回新生成的字符串裏沒有連續重複字符的字符串個數.連續重複隻以單個字符為準

例如, aab 應該返回 2 因為它總共有6中排列 (aab, aab, aba, aba, baa, baa), 但是隻有兩個 (aba and aba)沒有連續重複的字符 (在本例中是 a)

日期改寫算法

function makeFriendlyDates(arr) {
    var dateArr = ["", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th","11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th", "30th", "31st"],
        monthArr = ["", "January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December"],
    resarr = [];
    var caldate = function(startTime, endTime) {
        startTime = startTime.replace(/-/g, "/");
        endTime = endTime.replace(/-/g, "/");
        var newa = new Date(startTime);
            newa.setFullYear(newa.getFullYear() + 1);    
        newa = newa.getTime();
        var newb = new Date(endTime).getTime();
             if (newa <= newb) {
            return true;
        } else {
            return false;
        }
    };
    var a = arr[0].replace(/-0?/g, " ").split(" "),
    b = arr[1].replace(/-0?/g, " ").split(" "),
    nowYear = new Date().getFullYear();
    var str1 = monthArr[a[1]] + " " + dateArr[a[2]],
    str2 = dateArr[b[2]];
    var morethanoneyear = caldate(arr[0], arr[1]);
     if (!morethanoneyear) {
        if (a[0] != nowYear){
            str1 = str1 + ", " + a[0];//開始日期年份不是當前年份
        }
        if ((a[1] === b[1])&&(a[2] === b[2])) {//同年同月同日
             str2 = ""; 
        } else if(!((a[1] === b[1])&&(parseInt(a[2]) < parseInt(b[2])))){
            str2 = monthArr[b[1]] + " " + str2;
        }

    } else { //相差超過一年
        str1 ", "  //相差超過一年+ a[0];
        str2 = monthArr[b[1]] + " " + str2 + ", " + b[0];
    }
     if (str2 !== "") {
        resarr.push(str1, str2);
    } else {
        resarr.push(str1);
    }
    return resarr;
}    
makeFriendlyDa  te  s(['2016-09-01', '2017-07-04']);

把常見的日期格式如:YYYY-MM-DD 轉換成一種更易讀的格式。易讀格式應該是用月份名稱代替月份數字,用序數詞代替數字來表示天 (1st 代替 1)。記住不要顯示那些可以被推測出來的信息: 如果一個日期區間裏結束日期與開始日期相差小於一年,則結束日期就不用寫年份了。月份開始和結束日期如果在同一個月,則結束日期月份就不用寫了。另外, 如果開始日期年份是當前年份,且結束日期與開始日期小於一年,則開始日期的年份也不用寫。

例如:

makeFriendlyDates(["2016-07-01", "2016-07-04"]) 應該返回 ["July 1st","4th"]

makeFriendlyDates(["2016-07-01", "2018-07-04"]) 應該返回 ["July 1st, 2016", "July 4th, 2018"].

類及對象構建算法

var Person = function(firstAndLast) {
    var arr = firstAndLast.split(' '),
    firstName = arr[0],
        lastName = arr[1];
    this.getFirstName = function(){
        return firstName;
     };
    this.getLastName = function(){
        return lastName;
    };
    this.getFullName = function(){
        arr[0] = firstName;
        arr[1] = lastName;
        return arr.join(' ');
    };
    this.setFirstName = function(first){
         firstName = first;
    };
    this.setLastName = function(last){
        lastName = last;
    };
    this.setFullName = function(firstAndLast){
        arr = firstAndLast.split(' ');
        firstName = arr[0];
        lastName = arr[1];
    };
};
var bob = new Person('Bob Ross');
bob.getFullName();

用給定的方法構造一個對象:方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(last), and setFullName(firstAndLast).。所有有參數的方法隻接受一個字符串參數。所有的方法隻與實體對象交互

軌道周期算法

function orbitalPeriod(arr) {
    var GM = 398600.4418;
    var earthRadius = 6367.4447;
    for(var i=0;i<arr.length;i++){
            var R=arr[i].avgAlt+earthRadius;
        var T=R*2*Math.PI*Math.sqrt((R/GM));
        delete arr[i].avgAlt;
        arr[i].orbitalPeriod=Math.round(T);
    }
    return arr;
}
orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);

返回一個數組,其內容是把原數組中對應元素的平均海拔轉換成其對應的軌道周期。原數組中會包含格式化的對象內容,像這樣 {name: 'name', avgAlt: avgAlt}。地球半徑是 6367.4447 kilometers, 地球的GM值是 398600.4418, 圓周率為Math.PI

數據組合求值算法

function pairwise(arr, arg) {
    var len = arr.length;
    var sum = 0;
    for(var i=0;i<len;i++){
        for(var j=i+1;j<len;j++){
            if(arr[i]+arr[j] == arg){
                sum = sum + i + j;
                arr[i]='a';
                arr[j]='a';
            }
        }
    }
    return sum;
}
pairwise([1,4,2,3,0,5], 7);

舉個例子:有一個能力數組[7,9,11,13,15],按照最佳組合值為20來計算,隻有7+13和9+11兩種組合。而7在數組的索引為0,13在數組的索引為3,9在數組的索引為1,11在數組的索引為2。所以我們說函數:pairwise([7,9,11,13,15],20) 的返回值應該是0+3+1+2的和,即6

最後更新:2017-07-04 20:03:14

  上一篇:go  如何避免網站優化過度?
  下一篇:go  韓國服務器的有哪些優勢