剑指offer-[数字在排序数组中出现的次数]-JavaScript实现

题目描述

统计一个数字在排序数组中出现的次数。

思路分析1

这个思路和做法比较简单粗暴。由于是排序数组,所以相同的数字肯定是排在一起的。所以用两个循环,一个从头找一个从尾找,找到第一次出现的位置和最后一次出现的位置。再相减即可。

具体JS代码实现1

function GetNumberOfK(data, k)
{
    // write code here
    var start = -1
    var end = -1
    for(var i = 0;i < data.length; i++)
    {
        if(data[i]==k)
        {
            start = i;
            break
        }
    }
    for(var j = data.length-1; j>-1; j--)
    {
        if(data[j]==k)
        {
            end = j
            break
        }
    }
    if(start != -1 && end != -1)
    {
        return end - start + 1;
    }
    else
    {
        return 0
    }  
}

思路分析2

看到有序数组,就要想到二分法。但是与传统的二分法不同,这里同一个值可能出现多次,而我们要找到他出现的第一次和最后一次。所以要多进行一步判断。(注释中有说明)

具体JS代码实现2

	function GetNumberOfK(data, k)
	{
    	// write code here
    	if(data.length == 0)
    	{
    		return 0;
    	}
    	var first = theFirst(data,0,data.length-1,k)
    	var last = theLast(data,first-1,data.length-1,k)
    	if(first!=-1 && last!=-1)
    	{
    		return last-first+1;
    	}
    	else
    	{
    		return 0;
    	}
    	
	}
	//找到第一次出现K的位置
	function theFirst(data,start,end,k)
    {
        if(start>end)
        {
            return -1;
        }
        var mid = parseInt((start+end)/2)
        if(data[mid]>k)
        {
            end = mid - 1;
            return theFirst(data,start,end,k)
        }
        else if(data[mid]<k)
        {
            start = mid + 1
            return theFirst(data,start,end,k)
        }
        //还要多加一个判断如果mid-1也为k的话,说明第一次出现的位置还更小。
        else if((mid-1>=0) && (data[mid-1]==k))
        {
        	return theFirst(data,start,mid-1,k)
        }
        else
        {
            return mid;
        }
    }
    //找到最后一次出现K的位置
    function theLast(data,start,end,k)
    {
        if(start>end)
        {
            return -1;
        }
        var mid = parseInt((start+end)/2)
        if(data[mid]>k)
        {
            end = mid - 1;
            return theLast(data,start,end,k)
        }
        else if(data[mid]<k)
        {
            start = mid + 1
            return theLast(data,start,end,k)
        }
        //还要多加一个判断如果mid+1也为k的话,说明最后一次出现的位置还更大。
        else if((mid+1<data.length) && (data[mid+1]==k))
        {
        	return theLast(data,mid+1,end,k)
        }
        else
        {
            return mid;
        }
    }

你可能感兴趣的:(JavaScript,剑指Offer,leetCode)