數據結構和算法實例

綜述:數據結構和算法是高級前端的基礎知識,貴在總結

1.將數據中的數據轉成樹狀結構,實現前綴樹trie,前綴樹trie和tree之間的不同

 var transObject = function(tableData,keys){
        let hashTable = {}, res = []
        for (let i = 0; i < tableData.length; i++) {
            let arr = res, cur = hashTable
            for (let j = 0; j < keys.length; j++) {
                let key = keys[j], filed = tableData[i][key];
                if (!cur[filed]) {
                    let pusher = {value:filed},tmp;
                    if (j !== (keys.length - 1)){
                        tmp = [];
                        pusher.children = tmp
                    }
                    cur[filed] ={$$pos: arr.push(pusher) - 1 };
                    cur = cur[filed];
                    arr = tmp;
                } else {
                    cur = cur[filed];
                    arr = arr[cur.$$pos].children
                }
            }
        }
        return res
    };
    var data = [{
        "province": "浙江",
        "city": "杭州",
        "name": "西湖"
    }, {
        "province": "四川",
        "city": "成都",
        "name": "錦裏"
    }, {
        "province": "四川",
        "city": "成都",
        "name": "方所"
    }, {
        "province": "四川",
        "city": "阿壩",
        "name": "九寨溝"
    }];
    var keys = ['province', 'city', 'name'];
    console.log(transObject(data, keys));

2.使用js方法遍歷html結構?收集所有的標籤,使用數組存儲所有的標籤?

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <!-- 避免IE使用兼容模式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
    <meta name="renderer" content="webkit">
    <title>基礎信息</title>
    <!-- 瀏覽器標籤圖片 -->
    <link rel="icon" type="image/x-icon" href="/img/sf.png" media="screen" />
    <script src="//cdn.bootcss.com/redux/3.5.2/redux.min.js"></script>
</head>
<body>
<script>
      var tags = document.getElementsByTagName('*');
    var tagsArr = [];
    function countTag(){
        for (var i = 0; i < tags.length; i++) {
            tagsArr.push((tags[i].tagName).toLowerCase());
        }
        // 獲取到頁面的所有標籤
        console.log(tagsArr);
        //定義一個數組用於存放相同的元素
        var temp = [];
        //定義一個空數組用於存放每一個標籤;
        var tag =[];
        for (var i = 0; i < tagsArr.length; i++) {
            for (var j = i+1; j < tagsArr.length+1; j++) {
                if (tagsArr[i] == tagsArr[j]) {
                    temp.push(tagsArr[j]);
                    tagsArr.splice(j,1);
                    j--;
                }
                if (j == tagsArr.length -i) {
                    temp.push(tagsArr[i]);
                    tagsArr.splice(i,1);
                    i--;
                    tag.push(temp);
                    temp = [];
                }
            }
        }
        return tag;
    }
   console.log(countTag());

</script>
</body>
</html>

3.redux的使用,最簡單的demo

function inc() {
        return { type: 'INCREMENT' };
    }
    function dec() {
        return { type: 'DECREMENT' };
    }
    function add10() {
        return { type: 'ADD10' };
    }
    function reducer(state, action) {
        // 首次調用本函數時設置初始 state
        state = state || { counter: 0 }; //這裏是存儲的數據值

        switch (action.type) {
            case 'INCREMENT':
                return { counter: state.counter + 1 };
            case 'DECREMENT':
                return { counter: state.counter - 1 };
            case 'ADD10':
                return { counter: state.counter+10};
            default:
                return state; // 無論如何都返回一個 state
        }
    }

    var store = Redux.createStore(reducer);
    console.log( store.getState() ); // { counter: 0 }

    store.dispatch(inc());
    console.log( store.getState() ); // { counter: 1 }

    store.dispatch(inc());
    console.log( store.getState() ); // { counter: 2 }

    store.dispatch(dec());
    console.log( store.getState() ); // { counter: 1 }

    store.dispatch(add10());
    console.log( store.getState() ); // { counter: 1 }

4.斐波那契數列,0,1,2,3,5,8......後一個數字是前兩個數字之和?

5.爬梯子問題,1,2,3,5,8,9。。。。和第4題十分的相似,分別的代碼如下

    //斐波那契數列

  var  feibo=function(n){
         if(n===0||n===1){
              return n;
          }else if(n>1){
                 // return  feibo(n-2)+feibo(n-1);
                    return arguments.callee(n-2)+arguments.callee(n-1);
          }
    }
    console.log(feibo(12));   //144

      // 爬梯子問題 
  var climbStairs = function(n) {
          if(n===1||n===2||n===3){
              return n;
          }else if(n>3){
              return climbStairs(n-2)+climbStairs(n-1);
              return arguments.callee(n-2)+arguments.callee(n-1);
          }
      };
      console.log(climbStairs(45));

6.

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章