鍍金池/ 問答/人工智能  HTML/ 求助,如何判斷用戶輸入的區(qū)間不重復

求助,如何判斷用戶輸入的區(qū)間不重復

clipboard.png

如圖,每一行就是一個區(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}];   

clipboard.png

clipboard.png

clipboard.png

測試通過,可能看到函數(shù)會有疑問,為什么數(shù)組要排序,其實看下面實例。

var arr4=[{min:30,max:40},{min:20,max:30},{min:10,max:20}]  

這個數(shù)據(jù),區(qū)間范圍也沒有交叉,只是反過來寫了,所以,為了避免這個情況,所以就要先對數(shù)組進行排序

clipboard.png

看玩應該都懂了,我這里模擬的數(shù)據(jù),數(shù)組的每一個對象,其實就等同于你的每一行的數(shù)據(jù)。

clipboard.png

細節(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;
            }
        }
    }
}

clipboard.png

至于你說的包含情況,我改了下,代碼如下,看著就懂了

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}]  

clipboard.png

//前一個和當前都是閉區(qū)間,但是前一個的最大值和后一個的最小值相等
var arr10=[{min:10,max:20,minInclude:false,maxInclude:true},{min:20,max:30,minInclude:true,maxInclude:false}] 

clipboard.png

//前一個的最大值和當前的最小值,一個是閉區(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}]  

clipboard.png

//前一個的最大值和當前的最小值,一個是閉區(qū)間,一個是開區(qū)間,但是前一個的最大值和當前的最小值不想等
 var arr14=[{min:10,max:20,minInclude:false,maxInclude:false},{min:21,max:30,minInclude:true,maxInclude:false}] 

clipboard.png

 //前一個的最大值和當前的最小值,都是開區(qū)間,但是當前的最小值小于前一個的最大值
 var arr15=[{min:10,max:20,minInclude:false,maxInclude:false},{min:15,max:30,minInclude:false,maxInclude:false}]

clipboard.png

 //前一個的最大值和當前的最小值,都是開區(qū)間。前一個的最大值等于當前的最小值
 var arr16=[{min:10,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:false,maxInclude:false}]

clipboard.png

2018年5月27日 00:55
編輯回答
慢半拍

看了一下是不是可以用一個二維數(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ù)組了。

2018年4月11日 12:09
編輯回答
澐染
var source = [
    {
        min: {include: false, value: 10},
        max: {include: true, value: 20}
    },
    ...
]

類似這樣的數(shù)據(jù)結(jié)構(gòu),再判斷一下是否重復就行吧。

挨個從source中進行判斷,相當于判斷兩條線段是否重復了。比如兩條線段A、B。如果A.max <(=) B.min || A.min >(=) B.max。則這兩條線就是不重復的。

2017年8月22日 15:40