使用哈希表C ++组织字符串

时间:2015-05-28 09:27:57

标签: c++ string hash

我正在写一个代码:

  • 要求输入字符串
  • 将该字符串转换为它的ascii值
  • 然后将此号码发送到仅占用前8位的折叠功能 从右边开始,将它们分成3个数字,将它们加在一起,然后从右边开始前3个数字
  • 这个带3位数的数字是表示散列表的指针数组中字符串的顺序

例如:如果我输入字符串" abclmn" - > 979899100108109110 - >折叠功能08109110将数字分成3个数字,如此 - > 081,091,10 - > 81 + 91 + 10 = 182    和182是字符串" abclmn"应该插入哈希表

这是我的代码:

#include<iostream>
#include<cmath>
#include<string>
#include<queue>
using namespace std;
int folding(long int num1)
{
    int num;
    num=num1%100000000;
    int x=num/100000;
    int y=(num%100000)/100;
    int z=num%100;
    int w=(x+y+z)%1000;

    return w;
}

int main()
{    
    string s;
    cout<<"input the variable name"<<endl;
    cin>>s;

    int* a=new int [s.length()];
    for (int i=0;i<(s.length());++i)
    {
        a[i]=(int)s[i];
    }

    queue<int> q;

    for (int i=0;i<(s.length());++i)
    {
        if (a[i]<10) q.push(a[i]);
        else 
        if ((a[i]>9)&&(a[i]<100))
        {
            q.push(a[i]/10);
            q.push(a[i]%10);    
        }
        else if (a[i]>100)
        {
            q.push(a[i]/100);
            q.push((a[i]%100)/10);
            q.push(a[i]%10);

        }
    }//filling the number in a queue

    long int num=0;
    for (int i=(q.size());i>0;--i)
    {
        num=num+(q.front()*pow(10*1.0,i-1));
        q.pop();
    }

    cout<<"the answer"<<folding(num)<<endl;
    system("pause");
    return 0;

}

我的问题是我不知道字符串会有多长 所以如果字符串过于输出将是一个随机值 那是因为我使用long int作为输出值而且还不够。

对于这种或其他方式,是否有解决方案来获得相同的结果?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

将该字符串转换为ascii值

     

然后发送此号码   折叠功能,只取右边的前8位数,   将它分成3个数字,将它们加在一起,然后取3个数字   右边的数字也是

好吧,既然您只对最后8位数感兴趣,我们就不需要将整个字符串转换为ASCII表示形式。 让我们尝试沿着字符串向后遍历并以这种方式构建我们的数字。

int getDigits( std::string s ) {
    long long int digits = 0;
    int runningLength = 0;
    int prevLength = 0;
    for ( auto it = s.rbegin(); it != s.rend(); ++it ) {
        runningLength += prevLength;
        //if digits is a 7 digit number then appending a 3 digit number would overflow an int
        digits += (long long int)*it * pow(10, runningLength);
        //we have to work out the length of the current digit
        //so we know how much we need to shift by next time
        int dLength = 0;
        for ( int d = *it; d > 0; dLength++, d /= 10 );
        prevLength = dLength;
        if ( digits >= 100000000 ) break;
    }
    return digits % 100000000;
}
  

然后将此数字发送到折叠函数,该函数仅取第8个   右边的数字,将它分成3个数字,将它们加在一起   ,然后从右边的前3位数字

你的代码看起来很好。

如果您使用基数16(并且仅假设可打印的ASCII),将字符串拆分为数字的代码将更加整洁。