使用散列表组织字符串

organizing strings using a hash table C++

本文关键字:字符串 列表      更新时间:2023-10-16

我写的代码是:

  • 请求字符串
  • 将字符串转换为它的ascii值
  • 然后将此号码发送给只接受前8位数字的折叠功能从右边开始,把它分成3个数字,把它们加在一起,然后也从右边取前3个数字
  • 这个带有3位数字的数字是表示哈希表的指针数组中字符串的顺序

例如:如果我输入字符串"abclmn" -> 979899100108109110 ->折叠函数08109110将数字分成3个数字,如下-> 081,091,10 -> 81+91+10=182182是字符串"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作为输出值,这是不够的。

那么是否有解决方案或另一种方法来获得相同的结果?

将该字符串转换为它的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),将字符串分割成数字的代码会简洁得多。