当我看到以下内容时,我正在浏览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的幂?
此外,当执行自动重新散列时,究竟会发生什么?哈希函数也改变了吗?
所以,你有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:这不是一个家庭作业问题,我只是准备采访.
所以,它是一个非常简单的问题,我知道解决方案是一个简单的功能,如下所示:
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)
任何人都可以详细说明为什么会发生这种情况?
在下面的示例代码中(因为检查无效而无法编译)我需要弄清楚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框架中的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)