c# - 字节数组操作 - 面试问题

标签 c# java arrays puzzle

我正在和我的 friend 讨论这个问题,他在采访中被问到了这个问题。问题是这样的。编写一个函数,它接受一个字节数组(二维)和一个整数 n 作为输入,初始假设是 M*N 字节数组的所有元素都为零,问题是用值填充“n”个字节数组元素1,例如,如果 M=5 且 N=5 并且 n 值为 10,则 Byte 数组应有 10/25 个元素为 1,其余 15 个值为 0。填充的值应是随机的,并且为一个单元格字节数组中应该只填充一次。我很想尝试自己解决这个问题。我已附上到目前为止我所想出的代码。

public Boolean ByteArrayFiller(int a,int b, int n)
    {
        int count = n;
        int iLocalCount = 0;
        byte[,] bArray= new byte[a,b];
        for (int i = 0; i <a; i++)
            for (int j = 1; j <b; j++)
                bArray[i, j] = 0;

        Random randa=  new Random();
        int iRandA = randa.Next(a);
        int iRandB = randa.Next(b);

        while (iLocalCount < n)
        {
            if (bArray[iRandA, iRandB] == 0)
            {
                bArray[iRandA, iRandB] = 1;
                iLocalCount++;
            }

            iRandA = randa.Next(a);
            iRandB = randa.Next(b);
            continue;
        }
        //do
        //{
        //     //iRandA = randa.Next(a);
        //     //iRandB = randa.Next(b);
        //    bArray[iRandA,iRandB]=1;
        //    iLocalCount++;

        //} while (iLocalCount<=count && bArray[iRandA,iRandB]==0);

        return true;
    }

我编写的代码是用 C# 编写的,但很容易理解。它能够完美地实现问题的目的(我做了一些试验,结果正确),但我在 C# 中使用了 Random 对象(相当于 Java 中的 Math.Rand)来填充字节数组,我一直在想如果Rand 对 a 和 b 返回相同的值。这种情况很有可能无限期地持续下去。这就是提问的目的吗?或者我针对这个问题提出的解决方案是否足够好!

我很好奇这里的专家是如何解决这个问题的?我只是在寻找新的想法来扩大我的视野。任何指示将不胜感激。感谢您花时间阅读这篇文章!

最佳答案

while 循环尝试随机位置直到找到一个好的位置通常是一种非常糟糕的方法。如果 n = M*N,则最后一个找到匹配项的概率为 1/(M*N)。如果 M*N 足够大,效率可能会非常低。

如果 M*N 不太大,我会创建一个 M*N 大小的临时数组,用数字 0 到 (M*N)-1 填充它,然后对其进行排列 - 即,您遍历它并将当前值与随机的其他值交换。

然后转到数组中的前 n 个元素并设置适当的单元格。 (行 = 值/列,列 = 值 % 列)。

关于c# - 字节数组操作 - 面试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5411716/

相关文章:

c - 编写一个接受所有 int 类型的二维数组作为参数的函数签名,无论用户选择哪种方法?

c# - C# 设置中的接口(interface)

c# - 无法分配 datagridview.columns[i].Width 属性

java - jax-ws 服务中的 "Operation Connection.commit is not allowed during a global transaction"

java - 按下按钮但未到达单击事件时应用程序崩溃

java - 如何正确传递变量?

c# - 集成测试数据库,我做对了吗?

c# - 如何从文件路径中删除版本号? -Winforms C#

php - 在 PHP 中从平面数组构建树

javascript - 使用正则表达式验证自定义表达式