如圖,每一行就是一個區(qū)間,行數(shù)不確定
判斷用戶輸入的區(qū)間不重復才能提交成功,不填就是默認的最大和最小
可以選擇包含或不包含對應的值,想得頭都大了(T_T)
不給出代碼,不知道你的數(shù)據(jù)是什么結(jié)構(gòu)的,不過沒事,你看我下面的代碼吧!
function checkArr(arr){
//排序
arr.sort(function(n1,n2){return n1.min-n2.min})
//遍歷
for(var i=0;i<arr.length;i++){
//區(qū)間的最小值不能大于等于區(qū)間的最大值
if(arr[i].min>=arr[i].max){
console.log('區(qū)間最大值最小值不能相等');
return;
}
//元素對比,從第二個元素開始
if(i>0){
//區(qū)間不能出現(xiàn)交叉的情況 比如:5-10 6-12 這樣就會導致 6,7,8,9,10這幾值就會兩個區(qū)間都在其中
if(arr[i].min<arr[i-1].max){
console.log('區(qū)間不能出現(xiàn)交叉情況');
return;
}
}
}
}
下面準備些測試數(shù)據(jù)
var arr1=[{min:1,max:10},{min:5,max:22},{min:5,max:22}],
arr2=[{min:1,max:1},{min:1,max:22},{min:22,max:26}],
arr3=[{min:1,max:10},{min:20,max:30},{min:30,max:40}];
測試通過,可能看到函數(shù)會有疑問,為什么數(shù)組要排序,其實看下面實例。
var arr4=[{min:30,max:40},{min:20,max:30},{min:10,max:20}]
這個數(shù)據(jù),區(qū)間范圍也沒有交叉,只是反過來寫了,所以,為了避免這個情況,所以就要先對數(shù)組進行排序
看玩應該都懂了,我這里模擬的數(shù)據(jù),數(shù)組的每一個對象,其實就等同于你的每一行的數(shù)據(jù)。
細節(jié)優(yōu)化
當然如果想首尾相連,或者區(qū)間的最大值不能大于默認的最大值,區(qū)間的最小值也不能小于默認的最小值,只需要多判斷幾次!下面看代碼吧,容易理解些
var _min=5,_max=50;
function checkArr(arr,min,max){
//排序
arr.sort(function(n1,n2){return n1.min-n2.min})
//遍歷
for(var i=0;i<arr.length;i++){
//區(qū)間的最小值不能大于等于區(qū)間最大值
if(arr[i].min>=arr[i].max){
console.log('區(qū)間的最小值不能大于等于區(qū)間最大值');
return;
}
//區(qū)間的最小值不能小于默認最小值
if(arr[i].min<min){
console.log('區(qū)間的最小值不能小于默認最小值');
return;
}
//區(qū)間的最大值不能大于默認最大值
if(arr[i].max>max){
console.log('區(qū)間的最大值不能大于默認最大值');
return;
}
//元素對比,從第二個元素開始
if(i>0){
//區(qū)間首尾是否相連(連續(xù) 1-10 10-20)。只要區(qū)間相連,不會出現(xiàn)區(qū)間相差
if(arr[i].min!==arr[i-1].max){
console.log('區(qū)間必須要相連');
return;
}
}
}
}
至于你說的包含情況,我改了下,代碼如下,看著就懂了
var _min=5,_max=50;
function checkArr(arr,min,max){
//排序
arr.sort(function(n1,n2){return n1.min-n2.min})
//遍歷
for(var i=0;i<arr.length;i++){
//區(qū)間的最小值不能大于等于區(qū)間最大值
if(arr[i].min>=arr[i].max){
console.log('區(qū)間的最小值不能大于等于區(qū)間最大值');
return;
}
//區(qū)間的最小值不能小于默認最小值
if(arr[i].min<min){
console.log('區(qū)間的最小值不能小于默認最小值');
return;
}
//區(qū)間的最大值不能大于默認最大值
if(arr[i].max>max){
console.log('區(qū)間的最大值不能大于默認最大值');
return;
}
//元素對比,從第二個元素開始
if(i>0){
//如果前一個的最大值和當前的最小值都是閉區(qū)間,那么當前的最小值一定要大于前一個的最大值(如果要求首尾相連,當前的最小值一定比前一個的最大值大1)
if(arr[i].minInclude&&arr[i-1].maxInclude&&arr[i].min-arr[i-1].max<=0){
console.log('取值范圍錯誤');
return;
}
//如果前一個的最大值和當前的最小值。一個是開區(qū)間,一個是閉區(qū)間,那么后一個的的最小值一定要等于當前的最大值
else if(arr[i].minInclude!==arr[i-1].maxInclude&&arr[i].min!==arr[i-1].max){
console.log('取值范圍錯誤');
return;
}
//如果前一個的最大值和當前的最小值都是開區(qū)間,那么那么當前的最小值一定要大于等于前一個的最大值(如過是首尾相連,這種情況,肯定不滿足條件)
else if((!arr[i].minInclude)&&(!arr[i-1].maxInclude)&&arr[i].min-arr[i-1].max<0){
console.log('取值范圍錯誤');
return;
}
}
}
}
//前一個和后一個都是閉區(qū)間
var arr9=[{min:10,max:20,minInclude:false,maxInclude:true},{min:21,max:30,minInclude:true,maxInclude:true}]
//前一個和當前都是閉區(qū)間,但是前一個的最大值和后一個的最小值相等
var arr10=[{min:10,max:20,minInclude:false,maxInclude:true},{min:20,max:30,minInclude:true,maxInclude:false}]
//前一個的最大值和當前的最小值,一個是閉區(qū)間,一個是開區(qū)間
var arr11=[{min:10,max:20,minInclude:false,maxInclude:true},{min:20,max:30,minInclude:false,maxInclude:false}]
var arr12=[{min:10,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:true,maxInclude:false}]
//前一個的最大值和當前的最小值,一個是閉區(qū)間,一個是開區(qū)間,但是前一個的最大值和當前的最小值不想等
var arr14=[{min:10,max:20,minInclude:false,maxInclude:false},{min:21,max:30,minInclude:true,maxInclude:false}]
//前一個的最大值和當前的最小值,都是開區(qū)間,但是當前的最小值小于前一個的最大值
var arr15=[{min:10,max:20,minInclude:false,maxInclude:false},{min:15,max:30,minInclude:false,maxInclude:false}]
//前一個的最大值和當前的最小值,都是開區(qū)間。前一個的最大值等于當前的最小值
var arr16=[{min:10,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:false,maxInclude:false}]
看了一下是不是可以用一個二維數(shù)組解決:
(function(arr){
for(let i=0;i<arr.length;i++){
if(arr[i][0] > arr[i][1]) return false;
if(arr[i+1] && arr[i][1] > arr[i+1][0]) return false;
}
return true;
})([[1,2],[3,4],[7,9]])
這個函數(shù)執(zhí)行結(jié)果就是根據(jù)是否有重復的區(qū)間,如果有就返回false如果沒有就返回ture。
至于包含不包含,就在于你如何初始化這個二維數(shù)組了。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構(gòu),發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。