腾讯模拟笔试-

题目:

在排序数组中,找出给定数字的出现次数.比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。

输入:

1,2,2,2,3

输出:

1(1)
2(3)
3(1)

package tengxun;

/*
 * 题目:
 * 在排序数组中,找出给定数字的出现次数.比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。
 * 输入:1,2,2,2,3
 * 输出:
 * 1(1)
 * 2(3)
 * 3(1)
 * 解题思路:
 * 二分查找算法直接找到第一个k及最后一个k
 * 最坏情况下时间复杂度为O(logn) */
import java.util.Scanner;

public class Solution {
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        String str[] = in.next().split(",");// 键盘输入一行空格/逗号分隔的整数数组
        int[] nums = new int[str.length];// 键盘输入一行空格/逗号分隔的整数数组
        for (int i = 0; i <= str.length - 1; i++) {
            nums[i] = Integer.valueOf(str[i]);
        }
        for (int i = 0; i <= str.length - 1; i++) {
            if (i == 0 || i != 0 && nums[i] != nums[i - 1]) {
                System.out.println(nums[i]+ "(" + (getEndK(nums, nums[i])
                                        - getStartK(nums, nums[i]) + 1) + ")");
            }
        }
    }

    private static int getEndK(int[] array, int k) {// 获取元素k最后出现位置
        // TODO Auto-generated method stub
        int low = 0, high = array.length - 1;
        while (low < high) {
            int mid = (low + high + 1) / 2;
            if (array[mid] <= k)
                // 当要查找的值比中位数大于等于时,把查找的低位限制为mid
                low = mid;
            else
                // 当要找的值比 中位数小时,把查找的高位限制为mid-1
                high = mid - 1;
        }
        return low;
    }

    private static int getStartK(int[] array, int k) {// 获取元素k第一次出现位置
        // TODO Auto-generated method stub
        int low = 0, high = array.length - 1;
        while (low < high) {
            int mid = (low + high) / 2;
            // 当要找的值比 中位数小于等于时,把查找的高位限制为mid+1
            if (array[mid] >= k)
                high = mid;
            else
                // 当要找的值比 中位数大时,,把查找的低位限制为mid+1
                low = mid + 1;
        }
        return low;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容