人人都来写算法 之 移除字符串中重复的字符,时间复杂度要求O(n),空间复杂度O(1)
2013-08-13 17:48
429 查看
移除字符串中重复的字符,不能使用额外的缓存空间。字符串支持所有的ASCII码字符。
注意: 时间复杂度要求O(n),空间复杂度O(1),可以使用额外的一个或几个变量,但不允许额外再开一个数组拷贝。
分析:
1. 时间复杂度为O(n)条件下,最佳的方法就是采用包含256个位置寻址的哈希表来表示ASCII码。但是条件中又限制只能使用几个变量,因此采用bit寻址的方法可能是最接近要求的方法。
2. 因为要求需要移除重复的字符,因此就需要在遍历并判别是否是重复字符的同时,需要给字符串从下标0开始重新移位保存,最后一个字符之后采用'\0'结尾。
#include <iostream>
using std::cout;
using std::endl;
void removeDuplicate(char s[])
{
int len = strlen(s);
if(len < 2)
{
return;
}
int newIndex = 0;
int check[8] = {0};
for(int i=0; i<len; ++i)
{
int gap = (int)(s[i]);
int index = gap / (sizeof(int)*8);
int shift = gap % (sizeof(int)*8);
if((check[index] & (1<<shift))==0)
{
s[newIndex] = s[i];
newIndex++;
check[index] |= (1<<shift);
}
}
s[newIndex] = '\0';
}
void printStrArray(char s[])
{
int len = strlen(s);
for(int i=0; i<len; ++i)
{
cout<<s[i]<<" ";
}
cout<<"\n-------------------------------"<<endl;
}
int main()
{
char s[] = "AaAbbccdg88dg&B%%&a*a*a";
printStrArray(s);
removeDuplicate(s);
printStrArray(s);
getchar();
}
注意: 时间复杂度要求O(n),空间复杂度O(1),可以使用额外的一个或几个变量,但不允许额外再开一个数组拷贝。
分析:
1. 时间复杂度为O(n)条件下,最佳的方法就是采用包含256个位置寻址的哈希表来表示ASCII码。但是条件中又限制只能使用几个变量,因此采用bit寻址的方法可能是最接近要求的方法。
2. 因为要求需要移除重复的字符,因此就需要在遍历并判别是否是重复字符的同时,需要给字符串从下标0开始重新移位保存,最后一个字符之后采用'\0'结尾。
#include <iostream>
using std::cout;
using std::endl;
void removeDuplicate(char s[])
{
int len = strlen(s);
if(len < 2)
{
return;
}
int newIndex = 0;
int check[8] = {0};
for(int i=0; i<len; ++i)
{
int gap = (int)(s[i]);
int index = gap / (sizeof(int)*8);
int shift = gap % (sizeof(int)*8);
if((check[index] & (1<<shift))==0)
{
s[newIndex] = s[i];
newIndex++;
check[index] |= (1<<shift);
}
}
s[newIndex] = '\0';
}
void printStrArray(char s[])
{
int len = strlen(s);
for(int i=0; i<len; ++i)
{
cout<<s[i]<<" ";
}
cout<<"\n-------------------------------"<<endl;
}
int main()
{
char s[] = "AaAbbccdg88dg&B%%&a*a*a";
printStrArray(s);
removeDuplicate(s);
printStrArray(s);
getchar();
}
相关文章推荐
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 给定一个字符串,查找该字符串中第一个重复出现的字符索引。要求:时间复杂度为O(n)。
- 删除重复的字符(给一个字符串,删除连续重复的字符,要求时间复杂度为O(1)……)
- 定义一个栈的数据结构,实现min函数,要求push,pop,min时间复杂度是0(1);找出字符串中的最长子串,要求子串不含重复字符,时间复杂度是O(n);
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 【每日一题】查找一个字符串中第一个只出现两次的字符。要求时间复杂度为O(N),空间复杂度为O(1)
- 设计一个算法移除字符串中的重复字符,并写出测试用例。
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 数据结构——算法之(017)( 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1))
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)