一、题目名称:小艺的英文名
时间限制:1000ms内存限制:256M
题目描述
小艺酱想给自己起—个英文名字。小艺酱想要装的自己学识渊博。所以她想要自己英文名字必须满足:
1.只有字母表中前k个小写字母。
2必须是回文串。
3.前k个小写字母每个字母至少出现—次。
小艺酱已经自己完成了部分空余的字母部分用’?’代替。
请你帮她完成她的英文名字。
输入描述:
第一行输入一个整数k。(1第二行输入小艺酱的英文名字name。(1
输出描述:
如果小艺的名字不存在输出“QAQ",如果存在多组解,输出字典序最小的一个解。
示例
输入
2
a??a
输出
abba
字符串处理,给一个不完整的字符串,要求用前k个字母补满使之成为字典序最小的回文串。
既然要回文串,且字典序最小,容易想到从字符串中间向两边,字母由大到小,对称进行填充,这样可以保证结果为字典序最小的回文串。
所以思路为:
用一个map或数组used[i],来存第i个字母是否使用过
1. 从中间字符开始,同时检查对称的两个字母,会出现三种情况:
(1)两个都是字母,如果相同则标记为used后继续,若不相同则不满足条件,输出“QAQ”
(2)一个字母一个"?",那"?"就用字母表示即可,标记used后继续
(3)两个“?”,那么我们从第k个字母往a遍历,找到第一个used[i]为false的,替换到两个"?",标记为used后继续;若所有字母都用过了,用“a”填充即可,这样保证字典序最小
这样处理完整个字符串后,检查used数组是否还有没用过的,如果有说明字母没用完,输出“QAQ”返回,如果都用过了,则输出处理后的字符串。
#includeusing namespace std; int main() { int k; string name; cin>>k; cin>>name; int length = name.length(); bool letter[30] = {false}; for(int i = 0; i < length; i++) { letter[name[i] - 'a'] = true; } for(int i = (length+1) / 2 - 1; i >= 0; i--) { if(name[i] != '?' && name[length-i-1] != '?') { if(name[i] != name[length-i-1]) { cout<<"QAQ"< = 0; j--) { if(letter[j] == false) { name[i] = j + 'a'; name[length-i-1] = j + 'a'; letter[j] = true; assign = true; break; } } if(!assign) { name[i] = 'a'; name[length-i-1] = 'a'; } } } for(int i = 0; i < length; i++) { if(name[i] == '?') { cout<<"QAQ"< 二、题目名称:分层遍历二叉树
时间限制:1000ms 内存限制:256M
题目描述
给定一棵二叉树,节点定义如下:
structNode{
Node "pLeft:Node "pRight:
int data;
};
要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出—行),每一层要求访问的顺序为从左到右,并将节点依次编号。下面是一个例子:
输入描述:
输入—行字符串。1(2)表示2是1的子树。(1<=strlen(str)< =1000)
输出描述:
输出二叉树的层次。每层占—行。
示例
输入
1(2(4,5(7,8)),3(6))
输出
1
2 3
4 5 6
7 8
看起来像树,实际也是字符串处理。
由于输入格式是用()表示子树,所以每多一层括号相当于树的深度+1,做判断即可。
输入范围最多为1000,则树深度不超过1000,用一个数组string tree[1010]来存每层的节点数字,用count来记录当前深度,tmpstr保存当前节点内容
count=0; tmpstr=""; 遍历输入字符串s,若s[i]
(1)是数字,则tmpstr+=s[i]
(2)是"(",
(a)若tree[count]为空,则tree[count]+=tmpstr; count++; tmpstr="";
(b)不为空,则tree[count]+=" " + tmpstr; count++; tmpstr="";
(3)是")",tree[count]+=" " + tmpstr; count--; tmpstr="";
(4)是",",
(a)若tmpstr不为空,说明前面是数字,tree[count]+=" " + tmpstr; tmpstr="";
(b)若tmpstr为空,说明前面是“)”,continue
最后遍历tree,按层输出所有不为空的就可以了。
#include#include using namespace std; int main() { string s; cin>>s; int length = s.length(); string result[1100] = {""}; string tmp = ""; int count = 0; for(int i=0; i 三、题目名称:查找整数
时问限制:1000ms 内存限制:256M
题目描述
给定—个非降序的整数数组,数组中包含重复数字(重复数字很多),给定任意整数,对数组进行二分查找,返回数组正确的位置,始出函数实现。
a.连续相同的数字,返回最后一个匹配的位置
b.如果数字不存在返回-1。(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
第一行给定数组长度n,目标值tar。(1第二行给出n个整数a.(1
输出描述:
按题目描述输出。
示例
输入
7 4
1 2 2 3 4 4 10
输出
5
二分查找,找到最后一个值为tar的元素位置,二分基础上做个变形即可,在判断mid == tar的时候,不要立刻return mid,增加判断
if(mid == len-1) return mid;
if(mid < len-1 && a[mid+1] != tar) return mid;
low = mid + 1;
这样保证找到的为最后一个值为tar的元素下标。
#includeusing namespace std; int main() { int n; int tar; int a[10100]; cin>>n>>tar; for(int i=0; i >a[i]; } int low = 0; int high = n-1; while(low <= high) { int mid = low + (high - low)/2; if(tar < a[mid]) { high = mid - 1; } else if(tar > a[mid]) { low = mid + 1; } else { if(mid == n - 1) { cout<



