`

大公司面试算法题 - 第三题

阅读更多
这道是个概率题:

题目:


给你一组整数链表,链表长度不定,让你随机取里面的 N 个数据,链表长度大于 N,保证 N 个数被从链表中等概率获得,不能计算链表长度并且只能遍历链表一次


这题我一开始也没有思路,经过面试官的提醒,说可以用置换的方法来解,于是解答出了解法:把链表前 N 个数先放进数组,然后取每 N + 1 个数,然后取一个 N + 1 的随机数,如果小于 N,则在取出的 N 个数中换出去第(N + 1) % N个数。这样一个一个按此算法一直到链表结束。

实际我最后一步取模的方法不对,应该是随机换出去一个。

下面算算随机换出去是否是等概率的。选出的前N个数被选中概率都为 N,第 N + 1 个数被选中的概率是 N / (N + 1),它把前面 N 个数换出去一个,每个数被换出去的概率是 1 / N,那么,前 N 个数留下的概率就为 1 - (1 / N) * (N / (N + 1)) = N / (N + 1),然后取第 N + 2 个数,照此方法进行替换,直到链表最后一个数。具体概率我就不算了,肯定是想等的。

下面把代码贴出来,BASE类只是个日志类,可以在前面的博客中找到,这里就不贴了:


import java.util.Arrays;
import java.util.LinkedList;
import java.util.Random;

/**
* <pre>
* 给你一个组整数,数据长度不定,让你随机取里面的数据,保证等概率,不能计算数据长度并且只能遍历链表一次
* </pre>
*
* @author chouy
*/
public class EquiprobableGetNumber extends Base
{
    public static void main(String[] args)
    {
        int NUMBERCOUNT = 10;
        Random random = new Random();
        int max = random.nextInt(50);
        info("length: " + max);
        LinkedList<Integer> list = new LinkedList<Integer>();
        for (int i = 1; i < max; i++)
            list.add(i);
        info("init: " + list.toString());
        int[] result = new EquiprobableGetNumber().calc(list, NUMBERCOUNT);
        info("result: " + Arrays.toString(result));
    }

    public int[] calc(LinkedList<Integer> array, int resultLength)
    {
        Random random = new Random();
        int[] result = new int[resultLength];
        int i = 0;
        for (; i < resultLength && !array.isEmpty(); i++)
            result[i] = array.remove();
        while(!array.isEmpty())
        {
            int tmp = array.remove();
            int rdmInt = random.nextInt(i++);
            if (rdmInt < resultLength)
            {
                result[random.nextInt(resultLength)] = tmp;
            }
        }
        return result;
    }
}

分享到:
评论

相关推荐

    算法大全-面试题-数据结构.docx

    - **递归法**(算法2&3): 递归法首先将链表逆序输出,然后进行反转。递归时,先处理子链表,再处理当前节点。在实际反转链表时,需要在递归调用后处理反转的逻辑,以确保链表的正确连接。 ```csharp public ...

    JAVA经典算法面试39题及答案

    JAVA经典算法面试39题及答案 本资源总结了39道经典的 JAVA 算法面试题目,每个题目都附带答案,涵盖了常见的算法问题,旨在帮助读者更好地掌握 JAVA 编程语言和算法设计。 算法概述 算法是计算机科学中最重要的...

    面试高频算法题总结-剑指Offer题解

    面试高频算法题总结-剑指Offer题解,主要包含: 数据结构 数组 字符串 链表 栈和队列 二叉树 图 堆 线段树 字典树 单调栈 算法 二分查找 排序 递归 动态规划 分治 记忆化搜索 贪心 回溯 位运算 数学 设计 其他 共66...

    算法大全-面试题-链表-栈-二叉树-数据结构

    这通常通过两次遍历来完成:第一次遍历获取链表长度,第二次遍历至特定位置(长度减去3)。更高效的方法是使用双指针技术,其中一个指针先向前移动三步,然后两个指针同步移动,当先移动的指针到达链表尾部时,另一...

    算法大全-面试题-数据结构

    【算法大全-面试题-数据结构】主要涵盖了与单链表相关的多项操作,这些操作是数据结构和算法面试中常见的问题。以下是对每个知识点的详细解释: 1. **单链表反转**: - 算法1是迭代法,通过三个辅助变量curr, next...

    Android面试算法题

    ### Android面试算法题知识点解析 #### 一、基础算法题:找出未放入数组中的两个数 **题目背景:** 在Android开发过程中,处理数组是非常常见的需求之一。此题旨在考察应聘者对基本数据结构(如数组)的理解以及...

    算法大全-面试题-数据结构1

    【算法大全-面试题-数据结构1】这篇文章主要探讨了单链表的相关操作,这些操作在面试中常常作为考察点,对于理解数据结构和算法至关重要。以下是对文章中提到的知识点的详细说明: 1. **单链表反转**:单链表反转是...

    算法大全-面试题-链表-栈-二叉树-数据结构.docx

    以上就是针对链表、栈、二叉树以及数据结构的一些常见面试题及其解题思路。这些知识点在实际的软件开发和算法设计中都有着广泛的应用。掌握这些基本操作和算法,对于提升编程能力和解决复杂问题的能力至关重要。

    算法面试经典 100题

    - 使用大顶堆存储数组中的元素,堆的大小为k。 - 遍历数组,每遇到一个新元素就将其加入堆中,若堆的大小超过k,则弹出堆顶元素。 - 最终堆中的元素即为最小的k个元素。 #### 6. 腾讯排数 **知识点**:本题考查如何...

    华为od的面试算法真题

    ### 华为OD面试算法真题解析:抢7游戏 ...以上是对华为OD面试算法真题“抢7游戏”的详细解析及实现过程,通过此题不仅能够加深对应聘者对动态规划这一算法思想的理解,还能提高解决实际问题的能力。

    微软等公司数据结构+算法面试第1-100题汇总(21题-40题答案)

    ### 数据结构与算法面试知识点(21题-40题) #### 第21题:整数求和的所有可能组合 **题目描述**:输入两个整数`n`和`m`,从数列1,2,3,...,n中随意取几个数,使其和等于`m`,要求将其中所有的可能组合列出来。 ...

    微软等公司数据结构_算法面试第1-100题汇总.pdf

    从给定的文件信息中,我们可以总结出一系列与数据结构和算法相关...以上题目不仅涵盖了数据结构的基本操作,还深入到了算法设计和优化,对于准备IT行业面试,尤其是针对微软等大公司的求职者而言,具有较高的参考价值。

Global site tag (gtag.js) - Google Analytics