Google 面试题:在排序数组中找最接近的 K 个数

zzzrf:给一个目标数 target, 一个非负整数 k, 一个按照升序排列的数组 A 。在 A 中找与 target 最接近的 k 个整数。返回这 k 个数并按照与 target 的接近程度从小到大排序,如果接近程度相当,那么小的数排在前面。

  1. k 是一个非负整数,并且总是小于已排序数组的长度。
  2. 给定数组的长度是正整数, 不会超过 10^4
  3. 数组中元素的绝对值不会超过 10^4

点此在线做题

样例 1:

输入: A = [1, 2, 3], target = 2, k = 3
输出: [2, 1, 3]

样例 2:

输入: A = [1, 4, 6, 8], target = 3, k = 3
输出: [4, 1, 6]

[题解]

直接在数组中二分查找 target, 如果不存在则返回大于 target 的最小的或者小于 target 的最大的元素均可.
然后使用两根指针从该位置开始向两端遍历, 每次把差值比较小的元素放入答案中然后将该指针向边界方向移动一下即可.

public class Solution {
    /**
     * @param A      an integer array
     * @param target an integer
     * @param k      a non-negative integer
     * @return an integer array
     */
    public int[] kClosestNumbers(int[] A, int target, int k) {
        int[] result = new int[k];

        if (A == null || A.length == 0) {
            return A;
        }
        if (k > A.length) {
            return A;
        }

        int index = firstIndex(A, target);

        int start = index - 1;
        int end = index;
        for (int i = 0; i < k; i++) {
            if (start < 0) {
                result[i] = A[end++];
            } else if (end >= A.length) {
                result[i] = A[start--];
            } else {
                if (target - A[start] <= A[end] - target) {
                    result[i] = A[start--];
                } else {
                    result[i] = A[end++];
                }
            }
        }
        return result;
    }

    private int firstIndex(int[] A, int target) {
        int start = 0, end = A.length - 1;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (A[mid] < target) {
                start = mid;
            } else if (A[mid] > target) {
                end = mid;
            } else {
                end = mid;
            }
        }

        if (A[start] >= target) {
            return start;
        }
        if (A[end] >= target) {
            return end;
        }
        return A.length;
    }
}
Google 的磁悬浮负载均衡器

holinhot:https://research.google/pubs/pub44824/ 想试一试这个磁悬浮负载均衡器, 文档我看了,说得很牛逼的样子,但是我找了很久没找到在哪下载啊。 难道不是开源的,只是出来水一下让大家看吗?holinhot:https://opensource.google/projects/list/featured 在这也没找…

谷歌云(Google Cloud)免费政策改变了?只有三个月了吗?

jememouse:https://cloud.google.com/free/docs/gcp-free-tier?hl=zh-cn 有没有朋友最近新建过,是否只有三个月了?Tink:是的 gqbre:握草。。 白嫖的日子一去不复返 trepwq:是…

Google+登录验证问题 - javascript

您好,我正在尝试在我的网站上实施Google+登录,除了PHP将检查用户的google ID和电子邮件以查看其是否拥有帐户,或者我需要为他们创建一个帐户之外,我已经完成了所有工作。我遇到的问题是如何验证来自客户端JavaScript的php接收的内容实际上是有效的?我的意思是,似乎有人可以轻松修改脚本以发送任何Google用户ID和电子邮件,然后以任何人的身…

Google Drive API访问我自己的帐户 - java

我希望在服务器/笔记本电脑上运行一个简单的过程,每天将文件每天上传一次到Google驱动器中。我不想分享此信息,不允许其他用户使用它等。我发现的所有示例似乎都涉及浏览到一个地址以获得用户(我)的许可,然后获取身份验证代码等并继续参考:Java quickstart有没有一种方法/示例可以做到这一点而无需浏览器,每次我只想为自己的帐户获得许可时都获得唯一的身份…

Google Adsense 第 5 次被拒绝 哭唧唧

manami:Google Adsense 上个月是因为疫情推迟审核新站,最近几次被拒绝的邮件内容变了,说是网站需要先修正一些问题,但在后台又没看到说哪些内容不符合规定要求…… 有没有老哥愿意分享下自己的网站通过 Google Adsense 审核的经验?网上搜到的一些文章都是营销文,没有什么借鉴的价值。thanks in advance !