两个问题请大家指教下
1.回文字符串:输入一个对称的字符串,部分字符被?遮蔽,要求补全字符,使得新字符串成为一个回文字符串。其中若对称位置均为?要求镜像地补上00-99的字符串,且每种字符串使用至多一次(即如99不能使用)
2.快速排序:对长为n的字符串,将其中第k位(排序1-n)作为关键值,进行一趟操作使得最后ak(保证ak仅出现一次)左边的值
#include
#include
int main() {
int n;
int i;
scanf("%d",&n);
char a[100001];
for(i=0; i<=100000; i++) {
a[i]='\0';
}
for(i=1; i<=n; i++) {
a[i]=getchar();
}
char p=0,q=0;
for(i=1; i<=n; i++) {
if(a[i]=='?'&&a[n+1-i]=='?') {//case1:对称位置均为?;
if(q<9)q++;
else if(q==9)p++;
q=0;
if(p==q)q++;//遍历00-99的组合;并且剔除两个数字相同的组合;
int j,k;
for(j=n; j>=i+1; j--) {
a[j+1]=a[j];
}//从i+1位到n位都往后挪一位;
a[i]=p;
a[i+1]=q;
n++;
for(k=n; k>=n+2-i; k--) {
a[k+1]=a[k];
}//从第n位到n+2-1位都往后挪一位;
a[n+1-i]=q;
a[n+2-i]=p;
n++;
}
else if(a[i]=='?'&&a[n+1-i]!='?') {//case2:对称位置仅有一个为?;
a[i]=a[n-1+i];
}
}
for(i=1; i<=n; i++) {
printf("%c",a[i]);
}
}
#include
int main() {
int n,k,mid;
scanf("%d %d",&n,&k);
int l=1,r=n;
int i;
int a[n+1];
a[0]='\0';
for(i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
mid=a[k];
while(lwhile(a[l]//l向右走直到遇见r或>=mid的数;
l++;
while(a[r]>=mid&&l//r向左走直到遇见l或
r--;
if(l//如果lr未相遇则交换其值;
int tmp1=a[l];
a[l]=a[r];
a[r]=tmp1;
} else if(l==r) {//如果lr相遇则交换其所在位置值与a[k]的值;
int tmp2=a[l];
a[l]=a[k];
a[k]=tmp2;
}
}
for(i=1; i<=n; i++) {
printf("%d ",a[i]);
}
}
输出错误:
1
镜像地补上00-99的字符串
这一句是啥意思
#include <stdio.h>
#include <string.h>
#define MAX 255
//补全字符,使得新字符串成为一个回文字符串。其中若对称位置均为?要求镜像地补上00-99的字符串,且每种字符串使用至多一次(即如99不能使用
void function(char t[],int len)
{
int count=0;
int p[MAX];
for(int i=0; i<len; i++)
{
if(t[i]=='?'&&t[len-1-i]!='?')
{
t[i]=t[len-1-i];
}
else if(t[i]=='?'&&t[len-1-i]=='?')
{
p[count++]=i;
}
}
int m=0,n=0;
for(int i=0; i<len; i++)
{
int flag=0;
for(int j=0;j<count;j++)
{
if(p[j]==i)
{
flag=1;
}
}
if(t[i]==t[len-1-i]&&flag==0)
{
printf("%c",t[i]);
}
else if(t[i]=='?'&&t[len-1-i]=='?'&&flag==1&&i<=len/2)
{
printf("%c%c",m+48,n+48);
n++;
if(n==10) {n-=10;m++;}
}
else if(t[i]=='?'&&t[len-1-i]=='?'&&flag==1&&i>len/2)
{
n--;
if(n==-1) {n+=10;m--;}
printf("%c%c",n+48,m+48);
}
}
}
int main()
{
char t[MAX];
gets(t);
int len=strlen(t);
function(t,len);
//puts(t);
return 0;
}
T1
#include<stdio.h>
#include<string.h>
int main()
{
char s[1024],result[2048]; // s 读入 , result 正方向结果存储
gets(s);
int head = 0,rHead = 0,rTail = 2047; // s头位置 , result的当前正方向长度 , result反方向位置
int tail = strlen(s)-1; // s尾位置
int flag = 0; // 都是 ? 的转换
while (head<=tail){
if(s[head]=='?' && s[tail]=='?')
{
result[rTail--] = result[rHead++] = '0' + flag/10%10; // 01 反着存嘚是 10
result[rTail--] = result[rHead++] = '0' + flag%10; // 如果题目要求的只是 00 , 11 , 22 这样的你简单的
flag++;
}
else if(s[head]=='?') result[rTail--] = result[rHead++] = s[tail];
else result[rTail--] = result[rHead++] = s[head];
head++;
tail--;
}
for(int z=0;z<rHead;z++) printf("%c",result[z]);
for(int z=rTail+1;z<2048;z++) printf("%c",result[z]);
return 0;
}
T2
#include<stdio.h>
int main()
{
char s[202210];
int sLen,k; // 字符比较的为 ASCII 码
scanf("%d %d\n",&sLen,&k);
gets(s);
int head=0,tail=sLen-1,key=s[k-1]; // 左右指针位置
while (head<tail){
while (s[head]<key) head++;
while (s[tail]>key) tail--;
char temp = s[head];
s[head] = s[tail];
s[tail] = temp;
if(s[head]!=key) head++;
if(s[tail]!=key) tail--;
}
puts(s);
return 0;
}
回文数字里面发现了一个错误,你这里的p q是数字不是字符,如果填上这样的是不可见字符。如果要输出可见字符要加上 '0' ,并且你要确认这个不能超过 '9' 不然是不可见字符