小编Sus*_*ant的帖子

为什么HashMap要求初始容量为2的幂?

当我看到以下内容时,我正在浏览Java的HashMap源代码

//The default initial capacity - MUST be a power of two.
static final int DEFAULT_INITIAL_CAPACITY = 16;
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么这个要求首先存在?我还看到允许创建具有自定义容量的HashMap的构造函数将其转换为2的幂:

int capacity = 1;
while (capacity < initialCapacity)
  capacity <<= 1;
Run Code Online (Sandbox Code Playgroud)

为什么容量总是必须是2的幂?

此外,当执行自动重新散列时,究竟会发生什么?哈希函数也改变了吗?

java hash hashtable hashmap

41
推荐指数
2
解决办法
2万
查看次数

从n个排序数组中查找第k个最小数字

所以,你有n个排序数组(不一定长度相等),你要返回组合数组中的第k个最小元素(即合并所有n个排序数组形成的组合数组)

我已经尝试了它和它的其他变种已经有一段时间了,直到现在我只觉得有两个相等长度的数组,两个都排序,一个必须返回这两个的中位数.这具有对数时间复杂度.

在此之后,我试图将其概括为在两个排序的数组中找到第k个最小的.是关于SO的问题.即使在这里,给出的解决方案对我来说并不明显.但是,即使我莫名其妙地设法说服该解决方案的我自己,我还是好奇,怎么解决绝对一般的情况下(这是我的问题)

有人可以解释我一步一步的解决方案(我认为应该采取对数时间,即O(log(n 1)+ log(n 2)... + log(n N)其中n 1,n 2 .. .n N是n个数组的长度)从更具体的情况开始并转移到更一般的情况?

我知道类似的问题对于更具体的案例有互联网,但我没有找到一个令人信服和明确的答案.

是一个关于SO的问题(及其答案)的链接,它处理5个排序的数组并找到组合数组的中位数.答案对我来说太复杂了,无法概括它.

对于更具体的案例(正如我在帖子中提到的),即使是干净的方法也是受欢迎的.

PS:你认为这可以进一步推广到未排序数组的情况吗?

PPS:这不是一个家庭作业问题,我只是准备采访.

arrays algorithm merge data-structures

23
推荐指数
1
解决办法
1万
查看次数

从字符串中删除空格 - 使用指针的In C风格

所以,它是一个非常简单的问题,我知道解决方案是一个简单的功能,如下所示:

  void removeSpaces(char* s) {
    char* source = s;
    char* dest = s;

    while(*source) {
        if(*source == ' ') {
            source++;
        } else {
            *dest++ = *source++;
        }
    }

    *dest = 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual C++ 2008 Express版

当我用以下内容调用它时,它可以正常工作,没有任何问题,即它删除所有空格:

int main() {
    char input[50] = "I       like            2% milk";
    removeSpaces(input);
    cout<<input;

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,问题是当我通过将字符串声明更改为此来调用它时:

char * input = "I       like            2% milk";
Run Code Online (Sandbox Code Playgroud)

我得到一个例外(某种访问违规)

removeSpace函数的这行代码显示异常

*dest++ = *source++;
Run Code Online (Sandbox Code Playgroud)

任何人都可以详细说明为什么会发生这种情况?

c++ string pointers

3
推荐指数
1
解决办法
1931
查看次数

检查Object是否为Task或Task <TResult>

在下面的示例代码中(因为检查无效而无法编译)我需要弄清楚returnValue是"TResult的任务"还是任务或其他类型.如果它是TResult的任务我可以访问并记录Result属性,如果它是一个Task,则没有返回值,我记录"[Task]",如果它们都不是这两个那么我可以直接记录返回值或记录一个["空值"]

public void LogReturnValue(obj returnValue)
{
   var valueToLog = "";
   if(returnValue is Task)
   {
       valueToLog = "[Task]";
   } else if(returnValue is Task<T>)
   {
     valueToLog = returnValue.Result;
   } 
   else 
   {
     valueToLog = returnValue ?? "[null]"
   }
   this.logger.Log(valueToLog);
}
Run Code Online (Sandbox Code Playgroud)

我想确定returnValue是否是TResult的任务或任务,然后如果是后者,我需要从结果中提取适当的值.我有一个想法是检查IsGenericType属性,但我不确定它是否会始终有效.

.net c# task async-await

3
推荐指数
1
解决办法
2028
查看次数

为什么.Net中的Exception类的ToString()方法不使用StringBuilder来构建字符串?

我希望下面的代码(来自.Net框架中的Exception类)使用StringBuilder来构建一个字符串,然后返回一个builder.ToString()而不是在现有字符串上使用"+"运算符,最终创建每次都有一个新的字符串.

我希望大家写.Net源代码可以尽可能地遵循最佳实践,因此我想仔细检查这是否仍然是某种最佳方式

private String ToString(bool needFileLineInfo, bool needMessage) {
    String message = (needMessage ? Message : null);
    String s;
    if (message == null || message.Length <= 0) {
        s = GetClassName();
    }
    else {
        s = GetClassName() + ": " + message;
    }

    if (_innerException!=null) {
        s = s + " ---> " + _innerException.ToString(needFileLineInfo, needMessage) 
              + Environment.NewLine 
              + "   "
              + Environment.GetResourceString("Exception_EndOfInnerExceptionStack");

    }

    string stackTrace = GetStackTrace(needFileLineInfo);
    if (stackTrace != null)
    {
        s += Environment.NewLine + stackTrace;
    }

    return …
Run Code Online (Sandbox Code Playgroud)

c# string stringbuilder tostring

2
推荐指数
1
解决办法
105
查看次数