回文字符串&快速排序问题

两个问题请大家指教下
1.回文字符串:输入一个对称的字符串,部分字符被?遮蔽,要求补全字符,使得新字符串成为一个回文字符串。其中若对称位置均为?要求镜像地补上00-99的字符串,且每种字符串使用至多一次(即如99不能使用)
2.快速排序:对长为n的字符串,将其中第k位(排序1-n)作为关键值,进行一趟操作使得最后ak(保证ak仅出现一次)左边的值k

#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

img


2
数字较少时正确,待排序数字较多时错误

镜像地补上00-99的字符串
这一句是啥意思

img

#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' 不然是不可见字符