每日几题
//问题描述:实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
#include "stdafx.h"
#include"FindUnique.h"
#include<cstring>
#include<iostream>
using namespace std;
/*
//算法思想:ASCII字符集中字符数256个,可用256位表示某个字符是否出现过,所有位始化为0,若第i位为1,表示出现过此字符,否则,将其设为访问过
bool isUnique(const char *s)
{
bool b[256];
memset(b,0,sizeof(b));
for(int i=0;s[i]!='\0';i++)
{
int pos=(int )s[i];
if(b[pos])
return false;
else
b[pos]=true;
}
return true;
}
*/
//用位操作实现
bool isUnique(const char *s)
{
int a[8]={0};
for(int i=0;s[i]!='\0';i++)
{
int pos=(int)s[i]; //把字符转化成对应的整数
int index=pos>>5; //整数又移5位,相当于除32取整,可得出整数所在数组中的位置
if(a[index]&(1<<(pos&0x1F))) //pos&0x0F相当于取整数的低5位,也即整数除32取余。1<<(pos&0x1F)找出整数所在的具体的位
return false;
else
a[index]|=(1<<(pos&0x1F));
}
return true;
}
此题用位操作,让我联想到编程珠玑中用位图对大规模数据进行排序的问题。以前只是看了书,并没有动手实践,借机一试,发现许多问题,记下以备后用
#include "stdafx.h"
#include<iostream>
using namespace std;
void bitSort(int a[],int n)
{
const int N=10000; // N的值应该为数据中最大的数值加一,N值的大小有较多疑惑,需要用到数组中的最大数,还需求数组最大值?若设的过大时间和空间上都是一种浪费
int bit_map[N/32+1];
for(int i=0;i<N;i++)
bit_map[i>>5]&=~(1<<(0x1F&i)); //清零 所有位操作的解释如上题解法二
for(int i=0;i<n;i++)
bit_map[a[i]>>5]|=(1<<(0x1F&a[i]));
for(int i=0;i<N;i++)
{
if(bit_map[i>>5]&(1<<(0x1F&i)))
cout<<i<<'\t';
}
}
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={3,2,4,69,1,8};
bitSort(a,6);
return 0;
}
浙公网安备 33010602011771号