1. 程式人生 > >位元組跳動2019校招前端筆試

位元組跳動2019校招前端筆試

/*
題目描述
給定序列a: a1、a2、……、an
從左到右依次操作a[i],生成新序列:
a[1]直接放新序列,從第二個數開始若a[i] > a[i - 1], 放入當前新序列最右邊,否則放入序列最左邊,
得到新序列b: b1、b2、……、bn

現給定最終新序列,求原始序列有多少種可能?*/

  //程式碼比較長,思路就是先把所有可能的結果找出,
  然後一一測試是否可以組成新的序列,如果可以就計數//
    /* 新序列排序規範*/

function aa(a){
	"use strict";
	
    var len=a.length;
	var leftarr=[];
	var rightarr=[];
	if(a.length<=1){
		return a;
	}
	for(var i=1;i<len;i++){
		if(a[i]>a[i-1]){
			rightarr.push(a[i]);
		}
		else{
			leftarr.unshift(a[i]);
		}
	}
	return [].concat(leftarr,a[0],rightarr);//拼接陣列返回一個新陣列

}
var a=[1,2,3,4,5,8];
/*排列組合一維陣列(且不含有相同數字)*/
function onetoone(arr1,arr2){
	"use strict";
	var a1;
	var a2;
	var a3=[];
	for(var i=0;i<arr1.length;i++){
		a1=arr1[i];
		for(var j=0;j<arr2.length;j++){
			a2=arr2[j];
			if(a1!==a2){
				var n=a1+""+a2;
				a3.push(n);
			}
		}
	}
	var a5=[];
	//這裡是為了將陣列的資料型別一致
	for(var m=0;m<a3.length;m++){
		var a=a3[m].split('');
		for(var l=0;l<a.length;l++){
			a[l]=parseInt(a[l]);
		}//字串String
		a5.push(a);//二維陣列
		
	}
	
	return a5;
}
/*排列組合二維陣列和一維陣列(且相同數字只出現一次)/*/
function compose(arr1,arr2){
	"use strict";
	var a5=[];
	for(var i=0;i<arr1.length;i++){
		for(var j=0;j<arr2.length;j++){
				if(arr1[i].indexOf(arr2[j])<0){
				    //連線為一個數組	
					a5.push(arr1[i].concat(arr2[j]));//二維陣列
					
			}
		}	
	}
		return a5;
		
}			

var m=0;
var a4=onetoone(a,a);
var len=a.length-2;
while(m<len){
	a4=compose(a4,a);
	m++;
}

var count=0;
for(var i=0;i<a4.length;i++){
	if((aa(a4[i])).toString()===a.toString()){
		count++;
	}
}
alert(count);
//最後,如果夥伴們有更好的方法請留言告訴我