Arrays 生成字符串等于给定字符内的给定和

Arrays 生成字符串等于给定字符内的给定和,arrays,string,algorithm,data-structures,Arrays,String,Algorithm,Data Structures,给定两个数字n和k,找到一个由小写字母组成的字符串s,使该字符串中所有元素的值之和等于k。 如果存在许多这样的字符串,请查找字典中最小的字符串 第i个小写字母的值为i,例如,a的值为1,b的值为2,依此类推 输入格式: 输入的第一行包含一个整数t,表示测试用例的数量。 t行后面的每一行都包含两个空格分隔的整数n和k 输出格式: 打印长度为n且字符串和值等于k的字典最小字符串 限制条件: 1generateLexicoString(int n,int k){ 字符[]a=新字符[n]; //首先用

给定两个数字n和k,找到一个由小写字母组成的字符串s,使该字符串中所有元素的值之和等于k。 如果存在许多这样的字符串,请查找字典中最小的字符串

第i个小写字母的值为i,例如,a的值为1,b的值为2,依此类推

输入格式: 输入的第一行包含一个整数t,表示测试用例的数量。 t行后面的每一行都包含两个空格分隔的整数n和k

输出格式: 打印长度为n且字符串和值等于k的字典最小字符串

限制条件:

1
generateLexicoString(int n,int k){
字符[]a=新字符[n];
//首先用字符“a”填充数组
对于(int i=0;i=0;i--){
如果(x>26){
a[i]=“z”;
x=(x-26)+1;
}
如果(x>0),则为else{
a[i]=(char)(a[i]+x);
x=0;
}
如果(x==0)
打破
}
字符串op=“”;

对于(inti=0;i您可以使用下面的“System.out.print(a[i]);”避免字符串追加


for(int i=0;i对不起,但我认为这里公认的解决方案缺少一个案例:

如果n=2,k=28。 那么解决方案应该是“bz”

generateLexicoString(int n,int k){
字符[]a=新字符[n];
//首先用字符“a”填充数组
对于(int i=0;i=0;i--){
如果(x>26){
a[i]=“z”;
x=(x-26)+1;
}
else如果(x==26){
a[i]=(char)(a[i]+25);
x=1;
}
如果(x>0),则为else{
a[i]=(char)(a[i]+x);
x=0;
}
如果(x==0)
打破
}

Char Arraya将是我们的答案。

在上面提供的解决方案中,它忽略了x正好为26的情况(例如,n=2和k=28)。 因此,需要进行一些修改

generateLexicoString(int n, int k){
    char[] a = new char[n];
    // Initially fill the array with character 'a'
    for(int i=0;i<n;i++){
        a[i] = 'a'; 
    }
    int a_count = n;
    int tot_count = k;
    int x = tot_count - a_count;
    for(int i=n-1;i>=0; i--){
        if(x> 26){
            a[i] = 'z';
            x = (x-26)+1;
        }
        else if(x == 26){
         a[i] = (char) (a[i] + 25);
          x = x - 25; 
        }
        else if(x > 0){
            a[i] = (char) (a[i] + x);
            x = 0;
        }
        if(x == 0)
            break;
    }
    String op= String.valueOf(a);
    System.out.println(op);
    // return op;
}
generateLexicoString(int n,int k){
字符[]a=新字符[n];
//首先用字符“a”填充数组
对于(int i=0;i=0;i--){
如果(x>26){
a[i]=“z”;
x=(x-26)+1;
}
else如果(x==26){
a[i]=(char)(a[i]+25);
x=x-25;
}
如果(x>0),则为else{
a[i]=(char)(a[i]+x);
x=0;
}
如果(x==0)
打破
}
String op=String.valueOf(a);
系统输出打印项次(op);
//返回op;
}
#包括
使用名称空间std;
int main()
{
int t;
cin>>t;
而(t--)
{
int n,k;
cin>>n>>k;
字符串s=“”;
对于(int i=n;i>0;i--)
{
如果(k-(i-1)>26)
{
s='z'+s;
k-=26;
}
其他的
{
字符c='a'-1+k-(i-1);
s=c+s;
k=i-1;
}
}
cout
char arr[]=新字符[n];
对于(int i=n-1;i>=0;i--){
如果(k>0){
如果(k>26){
k=k-26;
arr[i]=‘z’;
}否则{
内部温度=k-i;
arr[i]=(字符)(temp+97-1);
k-=温度;
}
}否则{
打破
}
}
返回字符串.valueOf(arr);

这似乎是一个家庭作业问题,请求家庭作业帮助的问题必须包括迄今为止为解决该问题所做工作的总结,以及对解决该问题所遇到的困难的描述。@irs102info是否可能存在任何无效结果,如-1 40,其中n=1和k=40,将像这样的案例曾经存在过吗?你有问题描述的链接吗,似乎是某个发布到网上的东西?@zenwraight,是的,我们可能会有无效的结果,在这种情况下,我们必须打印“-1”。我没有这个问题的链接。@LakshayGarg,这是我解决问题的方法,
char[]a=new char[n];例如(inti=0;i=0;i--){if(x>26){a[i]='z';x=(x-26)+1;}else(x>0){a[i]=(char)(a[i]+x);x=0;}if(x==0)break;}String op=“”;for(inti=0);它的程序似乎是O(n)它应该不会给你带来麻烦,嗯,很奇怪,因为我认为你做不到比这更好的事情。所以你得到了麻烦,这意味着你正在把这个代码提交到网上某个地方的一个问题上。你能把这个提交或问题的链接发送出去吗?@zenwraight是的,这是一个由我们公司主办的比赛,作为编程实践的一部分,链接不能根据策略与外部人员共享。您正在循环中向字符串追加字符。这需要为每次追加复制整个字符串,因此是一个O(n^2)操作。您可以尝试使用stringstream或拥有一个字符数组,在返回之前将其转换为std::string,这将使其成为O(n)操作。最好包括解释和理由,而不是仅仅发布一段代码。
 generateLexicoString(int n, int k){
char[] a = new char[n];
    // Initially fill the array with character 'a'
    for(int i=0;i<n;i++){
        a[i] = 'a'; 
    }
    int a_count = n;
    int tot_count = k;
    int x = tot_count - a_count;
    for(int i=n-1;i>=0; i--){
        if(x> 26){
            a[i] = 'z';
            x = (x-26)+1;
        }
        else if(x == 26){
            a[i] = (char) (a[i] + 25);
            x = 1;
        }
        else if(x > 0){
            a[i] = (char) (a[i] + x);
            x = 0;
        }
        if(x == 0)
            break;
    }
generateLexicoString(int n, int k){
    char[] a = new char[n];
    // Initially fill the array with character 'a'
    for(int i=0;i<n;i++){
        a[i] = 'a'; 
    }
    int a_count = n;
    int tot_count = k;
    int x = tot_count - a_count;
    for(int i=n-1;i>=0; i--){
        if(x> 26){
            a[i] = 'z';
            x = (x-26)+1;
        }
        else if(x == 26){
         a[i] = (char) (a[i] + 25);
          x = x - 25; 
        }
        else if(x > 0){
            a[i] = (char) (a[i] + x);
            x = 0;
        }
        if(x == 0)
            break;
    }
    String op= String.valueOf(a);
    System.out.println(op);
    // return op;
}
#include<bits/stdc++.h>
using namespace std;

int main() 
{
    int t;
    cin>>t;

    while(t--)
    {
        int n,k;
        cin>>n>>k;

        string s="";

        for(int i=n;i>0;i--)
        {
            if(k - (i-1) > 26)
            {
                s = 'z' + s;
                k-=26;
            }
            else
            {
                char c = 'a' - 1 + k - (i-1);
                s =  c + s;
                k=i-1;
            }
        }

        cout<<s<<endl;
    }
    return 0;
}