每日几题

 

//问题描述:实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)

#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;
}

posted @ 2013-09-10 16:02  sumile  阅读(294)  评论(0)    收藏  举报