我正在处理一个采访问题,我需要在不使用附加缓冲区的情况下从字符串中删除重复的字符。
下面是我的代码,但没有为该字符串"aabbab"
提供正确的输出。下面的代码有什么问题吗?
private static void removeDuplicates(char[] str) {
if (str == null)
return;
int len = str.length;
if (len < 2)
return;
int tail = 1;
for (int i = 1; i < len; ++i) {
int j;
for (j = 0; j < tail; ++j) {
if (str[i] == str[j])
break;
}
if (j == tail) {
str[tail] = str[i];
++tail;
}
}
str[tail] = 0;
}
调试后,我无法找出上面代码中的错误。
答案 0 :(得分:0)
它需要这样做
if (str == null)
return;
int len = str.length;
if (len < 2)
return;
for(int i = 0; i <len; i++) {
for(int j = i+1; j<len; j++) {
if(str[i] == str[j]) {
str[j] = 0;
}
}
}
但是结果看起来像这样a[space]b[space][space][space]
,因为我们只是将字符设置为0。
答案 1 :(得分:0)
这个问题的时间复杂度是O(n ^ 2)。
但是,如果您输入的char数组有一些限制,例如char数组在'a'和'z'之间。它具有O(n)方法来解决。
这样的想法是使用一个变量的位保存字符。
void removeDuplicate(char s[])
{
int len = strlen(s);
if(len < 2) return;
int check = 0, p = 0;
for(int i=0; i < len; ++i)
{
int v = (int)(s[i]-'a');
if((check & (1 << v))==0)
{
s[p++] = s[i];
check |= (1 << v);
}
}
s[p] = '\0';
}
ps。该代码来自其他网站。
答案 2 :(得分:0)
因此,基本上,我们将首先使用一些特殊字符标记重复项,然后再删除这些特殊字符。时间复杂度为O(n ^ 2)。
char[] str = "aabbabcdcd".toCharArray();
int len = str.length;
if (len < 2)
return;
步骤1,用一些特殊字符标记位置,例如0
或$
for (int i = 0; i < len-1; ++i) {
for(int j=i+1;j<len;j++)
{
if(str[i]==str[j])
{
str[j]=0; //<---mark the positions
}
}
}
输出:a b cd
步骤2,我们需要删除内部黑色空间
int j;
for(int i=1;i<len-1;i++)
{
if(str[i]==0)
{
for(j=i+1;j<len;j++)
{
if(str[j]!=0)
{
break;
}
}
if(j!=len) //<-----replace with blank
{
str[i] = str[j];
str[j]=0;
}
}
}
输出:abcd