有序数组中数字出现次数

给定一个单调递增有序数组A,给定一个数字N,试给出一个算法得到A中该数字N出现的次数。

package suanfa;

public class findcountofnumber {

	public static int countnumber(int[] a, int b) {
		int left = 0;
		int right = a.length - 1;
		int mid = 0;
		while (left < right) {
			mid = (left + right) / 2;
			if (a[mid] == b)
				break;
			else {
				if (a[mid] > b) {
					right = mid;
				} else if (a[mid] < b) {
					left = mid;
				}

			}
		}
		left = mid;
		int l = findlocation(a, left, b, -1);
		right = mid;
		int r = findlocation(a, right, b, +1);

		return r - l-1;
	}

	public static int findlocation(int[] b, int location, int value, int direction) {

		int step = 1;
		if (location > 0) {
			while (location > 0 &&location < b.length) {
				if (b[location] == value) {
					location = location + direction * step;
					step++;
					while (location < 0 || location > b.length) {
						location = location - direction * step;
						step--;
						location = location + direction * step;
					}
					continue;
				}

				if (b[location] > value) {

					for (int i = 0; i < step; i++) {
						if (b[--location] == value)
							break;
					}
                    break;
				}
				if (b[location] < value) {
					for (int i = 0; i < step; i++) {
						if (b[++location] == value)
							break;
					}
					break;
				}

			}
			return location;
		} else {
			return 0;
		}

	}

	public static void main(String[] args) {
		int arr[] = {1,2,2,3,3,3,3,4};
		int k=countnumber(arr,3);
		System.out.println(k);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值