常用算法
今天看面试题 看到一个全排序,一脸懵逼
百度了下:给定一个字符串,输出该字符串所有排列的可能。如输入“abc”,输出“abc,acb,bca,bac,cab,cba”。这个叫做全排序
自己就写了个, 不过效率不高 for执行了160次 if里面执行了60次
百度了下:给定一个字符串,输出该字符串所有排列的可能。如输入“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; }