攜程春招實習的最後三道編程題,照例總結一下javascript
第一道:字符串截取(涉及數組去重的知識點)html
給定一個長度小於 50 且包含字母和數字的任意字符串,要求按順序取出當中的數字和英文字母,數字須要去重,從新排列後的字符串數字在前,字母在後。java
樣例輸入
'攜程C2t0r1i8p2020校招'
樣例輸出:
'2018Ctrip'es6
個人思路:正則表達式
1.利用正則表達式的replace函數把字符串中的數字和英文字母取出來。編程
取出數字和英文字母能夠有兩種方法:數組
(1)利用正則表達式的replace函數數據結構
刪除非數字的字符:str.replace(/\D/ig,"")
刪除非英文字母的字符:str.replace(/[^A-Za-z]/ig,"")或者str.replace(/[^A-z]/ig,"")函數
(2)利用字符串的match方法ui
匹配字符串中所有的數字:str.match(/\d/g).join('')
匹配字符串中所有的英文字母:str.match(/[A-Za-z]/g).join('')或者str.match(/[A-z]/g).join('')
注:str.match(regex)和regex.exec(str)都是返回數組,具體對比解析能夠參考這篇文章:http://www.cnblogs.com/gagarinwjj/archive/2014/05/22/match_exec.html
2.數字字符串去重,可轉化爲數組再去重
其中數組去重的方法這裏總結一下:
(1)若是是基本類型去重,能夠
①建立新數組,而後利用indexof屬性循環遍歷
var newarr = [arr[0]]; for(var i=1;i<arr.length;i++){ if(newarr.indexOf(arr[i]) == -1){ newarr.push(arr[i]); } }
②利用數組的filter方法,將全部在過濾函數中返回ture的數組元素放進一個新數組中並返回(該方法不會改變原數組的值)
function unique(arr) { return arr.filter(function(ele,index) { return arr.indexOf(ele) === index; }); }
③利用es6的新特性set去重
ES6中新增了Set
數據結構,相似於數組,可是 它的成員都是惟一的 ,其構造函數能夠接受一個數組做爲參數,如:
let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3]; let set = new Set(array); console.log(set); // => Set {1, 2, 3, 4, 5}
ES6中Array
新增了一個靜態方法Array.from
,能夠把相似數組的對象轉換爲數組,如經過querySelectAll
方法獲得HTML DOM Node List
,以及ES6中新增的Set
和Map
等可遍歷對象,如:
let set = new Set(); set.add(1).add(2).add(3); let array = Array.from(set); console.log(array); // => [1, 2, 3]
因而,如今咱們能夠用一行代碼實現數組去重了:
var newarr = Array.from(new Set(arr));
(2)若是是基本+複雜類型去重
④利用對象的屬性去重。每次取出原數組的元素,而後再對象中訪問這個屬性,若是存在就說明重複
var obj = {};
var newarr = []; for(var i=0;i<arr.length;i++){ if(!obj[arr[i]]){ obj[arr[i]] = 1; newarr.push(arr[i]); } }
3.最後把數字字符串和英文字母字符串拼接一下
綜上,第一道題的實現代碼以下:
function test(str) { // var num = str.replace(/\D/ig,""); //num 輸出爲20182020 var num = str.match(/\d/g).join(''); console.log(num); var arr = num.split(''); var newarr = [arr[0]]; for(var i=1;i<arr.length;i++){ if(newarr.indexOf(arr[i]) == -1){ newarr.push(arr[i]); } } var newnum = newarr.join(""); // var words = str.replace(/[^A-Za-z]/ig,""); //Ctrip var words = str.match(/[A-Za-z]/g).join(''); console.log(words); return newnum+words; } var res = test('攜程C2t0r1i8p2020校招'); console.log(res);