这是Gayle Laakmann McDowell 撰写的《 破解编码面试
》
中的问题之一:
实现一种算法以确定字符串是否具有所有唯一字符。如果您不能使用其他数据结构怎么办?
作者写道:
我们可以通过使用位向量来稍微减少空间使用量。我们假设,在下面的代码,该字符串只有较低的情况下
'a'
通过'z'
。这将允许我们仅使用一个int。
作者具有以下实现:
public static boolean isUniqueChars(String str) {
int checker = 0;
for (int i = 0; i < str.length(); ++i) {
int val = str.charAt(i) - 'a';
if ((checker & (1 << val)) > 0)
return false;
checker |= (1 << val);
}
return true;
}
比方说,我们摆脱假设是“字符串只有小写'a'
通过'z'
”。而是,字符串可以包含任何类型的字符,例如ASCII字符或Unicode字符。
有没有像作者一样有效的解决方案(或者几乎和作者一样高效的解决方案)?
对于asccii字符集,您可以用4个long表示256位:您基本上是手工编码一个html" target="_blank">数组。
public static boolean isUniqueChars(String str) {
long checker1 = 0;
long checker2 = 0;
long checker3 = 0;
long checker4 = 0;
for (int i = 0; i < str.length(); ++i) {
int val = str.charAt(i);
int toCheck = val / 64;
val %= 64;
switch (toCheck) {
case 0:
if ((checker1 & (1L << val)) > 0) {
return false;
}
checker1 |= (1L << val);
break;
case 1:
if ((checker2 & (1L << val)) > 0) {
return false;
}
checker2 |= (1L << val);
break;
case 2:
if ((checker3 & (1L << val)) > 0) {
return false;
}
checker3 |= (1L << val);
break;
case 3:
if ((checker4 & (1L << val)) > 0) {
return false;
}
checker4 |= (1L << val);
break;
}
}
return true;
}
您可以使用以下代码为Unicode字符生成类似方法的主体:
static void generate() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1024; i++) {
sb.append(String.format("long checker%d = 0;%n", i));
}
sb.append("for (int i = 0; i < str.length(); ++i) {\n"
+ "int val = str.charAt(i);\n"
+ "int toCheck = val / 64;\n"
+ "val %= 64;\n"
+ "switch (toCheck) {\n");
for (int i = 0; i < 1024; i++) {
sb.append(String.format("case %d:\n"
+ "if ((checker%d & (1L << val)) > 0) {\n"
+ "return false;\n"
+ "}\n"
+ "checker%d |= (1L << val);\n"
+ "break;\n", i, i, i));
}
sb.append("}\n"
+ "}\n"
+ "return true;");
System.out.println(sb);
}
所以,我知道这可能是一个非常愚蠢的问题,我是一个初学者,试图学习Java基础知识,我有一个字符串数组的问题,我不太明白。当我尝试将单词输入到字符串数组中,并且单词的数量由用户设置(例如5)时,我总是可以少输入一个单词(例如4而不是5)。我的代码在下面。
问题内容: 上下文:我是CS n00b,正在通过“破解编码面试”来完成自己的工作。第一个问题要求“实施一种算法以确定字符串是否具有所有唯一字符”。我的(可能是幼稚的)实现如下: 作者建议以下实现: 是什么使作者的实现比我的更好(FWIW,作者的解决方案是在Java中,我将其转换为Python -我的解决方案是无法在Java中实现的解决方案)吗?或者,更一般而言,解决该问题需要什么?我采用的方法有什
我希望有一个用于密码匹配的regex,以确保密码包含: null 其他一些问题可以解决一些明确字母的脓肿问题。正如您在我接受的答案中所看到的,regex与我想要的并不接近。
问题内容: 我想将字符添加到字符串中,但要确保最终列表中的所有字母都是 唯一的 。 例如:→ 现在,我当然想到了两种解决方案。一种是使用,它将字符与ASCII码映射。因此,每当我遇到一个字母时,它都会将索引设置为。之后,我将扫描列表并附加所有已设置的列表。时间复杂度为 O(n) 。 另一个解决方案是使用和遵循相同的过程。映射完每个字符后,我将对字典中的每个键进行操作。这也将具有 线性 运行时间。
我在练习面试问题,其中一个问题是:“实现一个算法来确定字符串是否具有所有唯一的字符”。 但我的问题是:如果我们假设string可以包含象形文字符号或任何东西(代码点大于u+ffff...?),那么该如何解决。 所以,如果我理解的正确,我可以很容易地想到解决方案,如果给定的字符串包含的字符属于从u+0000到u+ffff的字符集--它们可以转换成16位char,但如果我遇到一个字符的代码点大于u+f
问题内容: 我一直在尝试定义一个函数,该函数将大写其他每个字母,并在accout中加上空格,例如: 应该打印 “ HOLLO WORLD”, 而不是 “ HELLO WORLD ” 我希望这是有道理的。任何帮助表示赞赏。 谢谢奥莉 问题答案: def foo(s): ret = “” i = True # capitalize for char in s: if i: ret += char.up
问题内容: 我对位向量如何实现此功能感到困惑(对位向量不太熟悉)。这是给出的代码。有人可以引导我完成这个吗? 特别是,这是怎么做的? 问题答案: 在这里用作位存储。整数值中的每个位都可以视为一个标志,因此最终是一个位数组(标志)。代码中的每一位都说明是否在字符串中找到带有位索引的字符。您可以出于相同的原因而不是使用位向量。它们之间有两个区别: 大小 。具有固定大小,通常为4个字节,这意味着8 *
问题内容: 我有这个作业问题,需要使用正则表达式删除字符串中的所有其他字符。 在一部分中,我必须删除索引1,3,5,…处的字符,具体操作如下: 这是我想要的打印。本质上,我一次匹配两个字符,然后替换为第一个字符。我使用组捕获来做到这一点。 问题是,我在作业的第二部分遇到麻烦,我需要删除索引0、2、4,…处的字符。 我已经完成以下工作: 此打印,但正确答案必须是。仅当输入字符串的长度为奇数时,我的正