天梯赛 L1-2 倒数第N个字符串 C++代码

题目描述

给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, …, aaz, aba, abb, …, abz, …, zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。

输入格式:

输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10​^5)。

输出格式:

在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。

输入样例:

3 7417

输出样例:

pat

代码(PAT已通过测试)

#include <iostream>
#include <string>
using namespace std;
//数据规模L(2 ≤ L ≤ 6)和 N(≤10​^5),当L=2时候,有26*26种可能,L=3时候26*26*26=17576  L=6时 26^6=308915776
//由于N(≤10​^5),所以应该逆序构造,列入当L=26时候,第一个位zzz  第二个zzy 第三个 zzw 知道第N个
int main() 
{
	int num,n;
	cin>>num>>n; 
	string ans("");
	int times=0;

	cout<<ans;
	
    if(num==2)
    {
    		for(char a='z';a>='a';a--)
    		{
    			for(char b='z';b>='a';b--)
    			{
                    times++;
    				if(times==n) 
    				{
    					ans.push_back(a);
    					ans.push_back(b);
    					cout<<ans;
    					return 0;
    				}
    			}
    		}
    }
    
    if(num==3)
    {
    		for(char a='z';a>='a';a--)
    		{
    			for(char b='z';b>='a';b--)
    			{
    				for(char c='z';c>='a';c--)
    				{
    					times++;
    					if(times==n) 
    					{
    						ans.push_back(a);
    						ans.push_back(b);
    						ans.push_back(c);							    						
    						cout<<ans;
    						return 0;
    					}	
    				}

    			}
    		}
    }

    if(num==4)
    {
     		for(char a='z';a>='a';a--)
    		{
    			for(char b='z';b>='a';b--)
    			{
    				for(char c='z';c>='a';c--)
    				{
    	            	for(char d='z';d>='a';d--)
    	            	{
    	            		times++;
    	            		if(times==n)
    	            		{
    	            			ans.push_back(a);
    	            			ans.push_back(b);
    	            			ans.push_back(c);
    	            			ans.push_back(d);
								cout<<ans;
    	            			return 0;
    	            		}
    	            	}
    				}

    			}
    		} 	
    }
    
    if(num==5)
    {
     		for(char a='z';a>='a';a--)
    		{
    			for(char b='z';b>='a';b--)
    			{
    				for(char c='z';c>='a';c--)
    				{
    	            	for(char d='z';d>='a';d--)
    	            	{
    	            		for(char e='z';e>='a';e--)
    	            		{
    	            			times++;
    	            			if(times==n)
    	            			{
    	            				ans.push_back(a);
    	            				ans.push_back(b);
    	            				ans.push_back(c);
    	            				ans.push_back(d);
    	            				ans.push_back(e);
									cout<<ans;
    	            				return 0;
    	            			}
    	            		}
    	            	}
    				}

    			}
    		}      	
    }
    
    if(num==6)
    {
     		for(char a='z';a>='a';a--)
    		{
    			for(char b='z';b>='a';b--)
    			{
    				for(char c='z';c>='a';c--)
    				{
    	            	for(char d='z';d>='a';d--)
    	            	{
    	            		for(char e='z';e>='a';e--)
    	            		{
    	            			for(char f='z';f>='a';f--)
    	            			{
    	            				times++;
    	            				if(times==n)
    	            				{
    	            					ans.push_back(a);
    	            					ans.push_back(b);
    	            					ans.push_back(c);
    	            					ans.push_back(d);
    	            					ans.push_back(e);
    	            					ans.push_back(f);
    	            					cout<<ans;
    	            					return 0;
    	            				}
    	            			}
    	            		}
    	            	}
    				}

    			}
    		}      	
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: . , aaz, aba, abb, abc, . . . }。现在给定一个字符串 s,请你判断它是否在该等递增序列出现。 回答:首先,我们可以计算出 s 在该等递增序列的位置,即 (s - "aaa") / l + 1。如果该位置是整数,说明 s 在该序列出现。否则,说明 s 不在该序列出现。 ### 回答2: 这个问题可以分为两个部分来考虑:如何构造出等递增序列,以及如何判断一个字符串是否在序列出现。 先考虑构造序列的方法,可以从第一个字符串 "a" 开始,每次加上步 1,得到下一个字符串。但这样的序列度非常有限,只有 26 个字符串。如果我们希望构造更序列,可以利用字符串的大小比较关系,从前一个字符串生成下一个字符串。具体地,我们从字符串的末尾开始,向前找到第一个不是 'z' 的字符,将其加 1,然后将它之后的所有字符都变为 'a'。这样可以保证每次生成的字符串比前一个字符串大 1 并且度相等。重复这个过程,就可以构造出完整的等递增序列。 接下来考虑如何判断一个字符串是否在序列出现。从上一步的构造方法可以看出,序列字符串都具有一定的规律,因此可以利用这个规律来判断一个字符串是否在序列。具体地,我们可以从字符串的末尾开始,向前比较字符是否相等。如果相等,继续比较前一个字符;否则判断前一个字符的大小关系。如果前一个字符比当前字符小 1,证明这个字符在序列出现了,否则不在序列。 需要注意的是,在比较字符大小关系的时候,应该将字符转换成它们在 ASCII 码表的对应数字来比较。同时,为了避免字符串转换成数字导致的精度问题,可以将字符串每个字符都减去 'a' 的 ASCII 码值,这样就将字符转换成了 0-25 的数字。比较时只需要判断相邻两个字符是否为 1 即可。 综上所述,给定一个完全小写英文字母组成字符串递增序列,可以使用上述方法构造序列并判断字符串是否在序列出现。时间复杂度为 O(nl),其 n 为序列度,l 为每个字符串度。 ### 回答3: 这道题可以采用递归算法来解决。首先我们可以很容易地知道,等递增序列的首项一定是由 l 个 a 组成,因此我们可以先生成这个序列的首项。之后,我们可以通过递归调用来依次生成序列的后续项。 具体来说,我们可以将问题分解为两个子问题:首先,我们需要生成一个度为 l-1 的等递增序列,然后将每个子项的末尾追加一个从 a 到 z 的小写字母,即可得到度为 l 的等递增序列。 在递归调用的过程,我们需要传递两个参数:当前项的字符串,以及当前项的位置。我们可以不断迭代当前项的位置,直到其等于度 l。此时,我们就得到了一个完整的等递增序列。最后,我们将这个序列添加到结果列表,结束递归调用。 大致的代码实现如下: def generate_sequences(l: int, current: str, pos: int, res: List[str]): if pos == l: res.append(current) else: for c in string.ascii_lowercase: next_str = current + c if len(next_str) <= pos or ord(next_str[pos-1]) + 1 == ord(c): generate_sequences(l, next_str, pos+1, res) 其,string.ascii_lowercase 表示小写英文字母表,ord(c) 表示获取 c 字符对应的 ASCII 码值。 总体来说,这道题主要考察了编程的递归算法字符串操作,需要考生对这两个方面都有一定的熟练掌握能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值