一道面试题,请帮忙作一下。

时间:2022-06-28 10:28:18
请大家帮我做到题,有一个字符串,里面可能含有重复的字符,需要将重复的字符去掉,生成新的字符串。比如A11CC000,最后生成A1C0。

不知道大家有什么好的方法,请帮忙写一下,多谢了。

28 个解决方案

#1


是要相邻的重复的字符吗?? 

是的话就从头遍历,跟前一个字符对比,一样的话就删掉

#2


是相邻的重复字符,不知道大家有什么好的方法?

#3


肯定要遍历了,记录上一个位置的字符
加上记录重复长度,就是简单的压缩算法了

#4


能给出代码么?多谢了。

#5


搞一个哈希表,每碰到一个都hash,如果存在删除,不存在加入。

#6



void main() 

    char str[] = "A11CC000";
int  pos   = 0;
int  delta = 0;  
printf("原始字符串为:%s,", str);
for(int i=1; i<=strlen(str); i++)
{
if(str[i-1]==str[i])
delta++;
else
{
    str[pos]=str[pos+delta];
pos++;
}

}
str[pos]='\0';
printf("压缩之后的字符串为:%s", str);

#7


里面包含汉字之类的么。
即使是unicode编码的那种,也不过几万的数组就能存下它的总的数目。

遇到每一个字符就打一个标记,最后遍历下这个标记数组即可。它没有要求顺序吧

#8


都进行面试了,还这样的水平,楼主大学干什么去了,

#9


如果是判断相邻的重复,似乎不难呀!

for(int i = 0;i < str.length;i++)
{
if(current != str[i])
{
current = str[i];
printf(current);
}
}

#10


不难.

#11


不难,简单点的就是用个map

#12


引用 11 楼 qq675927952 的回复:
不难,简单点的就是用个map


map 都不用
bool ch[26],nu[10]
出现过的标记为true 
这样最简单了。

#13


相邻的。。。
easier

#14


2楼的思路没错

#15


应该很简单

思路:
1.初始一个栈s
2.读取字符串,指针p指向首字符  指针q指向p+1;
3.
while(p!=NULL) {
    如果(*p!=*q)   *p 入栈s;
    否则p++;
}
4.输出时 注意是逆序的

#16


5.再搞个栈倒序下下 就可输出了


#17


#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="A11CC000",str2;
str2=str2+str1[0];
for(size_t i=1;i!=str1.size();i++ )
{
if (str1[1]!=str1[i-1])
str2=str2+str1[i];
}
cout<<str2; //str2为去掉相邻重复后的字符串
return 0;
}
输出为AC1000
各位认为错再哪

#18


if (str1[1]!=str1[i-1]) 
这里错了.

#19


1楼正解

#20


C# code : 如果是相邻的不能重复的话

 string s = "A11CC000";
 string outstring = s[0].ToString(); //the string u want 
 for(int i=1;i<s.Length;i++)
 {

     if (s[i] != outstring[outstring.Length - 1])
        {
            outstring += s[i];
        }
     else
        continue;
  }
  Console.Write(outstring);

#21



void delrep(char * s)
{
if (!(s&&(*s))) return;
char * d = s++;
while (*s) 
if (*d==*s) s++;
else *++d=*s++;
*++d=0;
}

int main()
{
char s[] = "A11CC000";
delrep(s);
printf(s);
return 0;
}

#22


这个很简单啊 !!
for(i=1,j=1;i <s.Length;i++) 
{   ch=s[i-1];     //下标从0开始
   if(ch!=s[i])
       s[j++]=s[i];
}
   

#23


很多正解啊.不知道顶那个啦.

#24


这个要实现起来,很简单,我就是还没看到最好的方法

#25


ding 21 lou ba

#26


现在还没有找工作的,一定要好好准备了

引用 8 楼 wsoon 的回复:
都进行面试了,还这样的水平,楼主大学干什么去了,

#27



public class TestString {
public static void main(String[] args) {
String str = "Abbbbbb11CC000";
char[] cs = str.toCharArray();
char temp = 0;
String rs = "";
for (char c : cs) {
if (temp != c) {
rs += c;
temp = c;
}
}
System.out.println(rs);
}
}

#28


up 

引用 9 楼 litaoye 的回复:
如果是判断相邻的重复,似乎不难呀!

 for(int i = 0;i  < str.length;i++)
 {
 if(current != str[i])
 {
 current = str[i];
 printf(current);
 }
 }

#1


是要相邻的重复的字符吗?? 

是的话就从头遍历,跟前一个字符对比,一样的话就删掉

#2


是相邻的重复字符,不知道大家有什么好的方法?

#3


肯定要遍历了,记录上一个位置的字符
加上记录重复长度,就是简单的压缩算法了

#4


能给出代码么?多谢了。

#5


搞一个哈希表,每碰到一个都hash,如果存在删除,不存在加入。

#6



void main() 

    char str[] = "A11CC000";
int  pos   = 0;
int  delta = 0;  
printf("原始字符串为:%s,", str);
for(int i=1; i<=strlen(str); i++)
{
if(str[i-1]==str[i])
delta++;
else
{
    str[pos]=str[pos+delta];
pos++;
}

}
str[pos]='\0';
printf("压缩之后的字符串为:%s", str);

#7


里面包含汉字之类的么。
即使是unicode编码的那种,也不过几万的数组就能存下它的总的数目。

遇到每一个字符就打一个标记,最后遍历下这个标记数组即可。它没有要求顺序吧

#8


都进行面试了,还这样的水平,楼主大学干什么去了,

#9


如果是判断相邻的重复,似乎不难呀!

for(int i = 0;i < str.length;i++)
{
if(current != str[i])
{
current = str[i];
printf(current);
}
}

#10


不难.

#11


不难,简单点的就是用个map

#12


引用 11 楼 qq675927952 的回复:
不难,简单点的就是用个map


map 都不用
bool ch[26],nu[10]
出现过的标记为true 
这样最简单了。

#13


相邻的。。。
easier

#14


2楼的思路没错

#15


应该很简单

思路:
1.初始一个栈s
2.读取字符串,指针p指向首字符  指针q指向p+1;
3.
while(p!=NULL) {
    如果(*p!=*q)   *p 入栈s;
    否则p++;
}
4.输出时 注意是逆序的

#16


5.再搞个栈倒序下下 就可输出了


#17


#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1="A11CC000",str2;
str2=str2+str1[0];
for(size_t i=1;i!=str1.size();i++ )
{
if (str1[1]!=str1[i-1])
str2=str2+str1[i];
}
cout<<str2; //str2为去掉相邻重复后的字符串
return 0;
}
输出为AC1000
各位认为错再哪

#18


if (str1[1]!=str1[i-1]) 
这里错了.

#19


1楼正解

#20


C# code : 如果是相邻的不能重复的话

 string s = "A11CC000";
 string outstring = s[0].ToString(); //the string u want 
 for(int i=1;i<s.Length;i++)
 {

     if (s[i] != outstring[outstring.Length - 1])
        {
            outstring += s[i];
        }
     else
        continue;
  }
  Console.Write(outstring);

#21



void delrep(char * s)
{
if (!(s&&(*s))) return;
char * d = s++;
while (*s) 
if (*d==*s) s++;
else *++d=*s++;
*++d=0;
}

int main()
{
char s[] = "A11CC000";
delrep(s);
printf(s);
return 0;
}

#22


这个很简单啊 !!
for(i=1,j=1;i <s.Length;i++) 
{   ch=s[i-1];     //下标从0开始
   if(ch!=s[i])
       s[j++]=s[i];
}
   

#23


很多正解啊.不知道顶那个啦.

#24


这个要实现起来,很简单,我就是还没看到最好的方法

#25


ding 21 lou ba

#26


现在还没有找工作的,一定要好好准备了

引用 8 楼 wsoon 的回复:
都进行面试了,还这样的水平,楼主大学干什么去了,

#27



public class TestString {
public static void main(String[] args) {
String str = "Abbbbbb11CC000";
char[] cs = str.toCharArray();
char temp = 0;
String rs = "";
for (char c : cs) {
if (temp != c) {
rs += c;
temp = c;
}
}
System.out.println(rs);
}
}

#28


up 

引用 9 楼 litaoye 的回复:
如果是判断相邻的重复,似乎不难呀!

 for(int i = 0;i  < str.length;i++)
 {
 if(current != str[i])
 {
 current = str[i];
 printf(current);
 }
 }