常用算法

今天看面试题 看到一个全排序,一脸懵逼
百度了下:给定一个字符串,输出该字符串所有排列的可能。如输入“abc”,输出“abc,acb,bca,bac,cab,cba”。这个叫做全排序
自己就写了个, 不过效率不高 for执行了160次 if里面执行了60次 
var str = 'abca', number = 0;
        function jisu() {
            var allList = [];
            for (var i = 0; i < str.length; i++) {
                One(str, { index: [i], str: str[i] }, allList)
            };
            return allList;
        }
        function One(str, list, allList) {
            var i, iData, newList;
            if (list.str.length === str.length) {
                allList.push(list.str);
                return;
            }
            for (i = 0; i < str.length; i++) {
                number++;
                if (list.index.indexOf(i) == -1) {
                    newList = JSON.parse(JSON.stringify(list))
                    newList.index.push(i);
                    newList.str += str[i];
                    One(str, newList, allList)
                }
            }
        }
        console.log('allList:', jisu(), number);

 观看了网上了 优化版本 , 我之前做的是重新组合,网上的版本是排序

 

 
 
/*
var data = {
      keyWord: '123',
      paice_code: '1',
      paice_kehu: '1',
      paice_more_0_number: '1',
      paice_more_0_paice: '2',
      paice_more_1_number: '3',
      paice_more_1_paice: '4',
}
转换成 {keyword:'123',paice:{code:1,kehu:1,more:{0:{number:1,paice:2},1:{number:3,paice:4}}}}
没有用数组 觉得差距不大 
*/
function H_KeyStringToObj(data) {
  let obj = {};
  for (var key in data) {
    arrayToObj(key.split('_'), data[key], obj)
  };
  return obj
}
function arrayToObj(keyName, value, allData) {
  let fisrtKey = keyName.splice(0, 1)[0];
  allData[fisrtKey] = allData[fisrtKey] || {};
  if (keyName.length == 0) {
    allData[fisrtKey] = value;
    return allData;
  } else {
    allData[fisrtKey] = arrayToObj(keyName, value, allData[fisrtKey])
  }
  return allData;
}

 

posted @ 2018-03-26 17:34  V黑匣子  阅读(106)  评论(0编辑  收藏  举报