首页 > 试题广场 >

字符串合并处理

[编程题]字符串合并处理
  • 热度指数:192864 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

按照指定规则对输入的字符串进行处理。

详细描述:

第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" , 合并后生成的字符串为 "decfab"

第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序(生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'),再依次分别放回原串中的偶数位和奇数位,新字符串变为“abcedf”

第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。
转换规则如下:
对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。
如字符 '4',其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 '2'。
如字符 ‘7’,其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 'E'。
如字符 'C',代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 '3'。

根据这个转换规则,由第二步生成的字符串 “abcedf” 转换后会生成字符串 "5D37BF"。


数据范围:输入的字符串长度满足



输入描述:

样例输入两个字符串,用空格隔开。



输出描述:

输出转化后的结果。

示例1

输入

dec fab

输出

5D37BF
示例2

输入

ab CD

输出

3B5D

说明

合并后为abCD,按奇数位和偶数位排序后是CDab(请注意要按ascii码进行排序,所以C在a前面,D在b前面),转换后为3B5D          
示例3

输入

123 15

输出

88C4A
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

void swap(char *a, char *b){
    char temp = *a;
    *a =  *b;
    *b = temp;
}

char change(int num){
    int sum = 0, temp = 0;
    if(num >= 0 && num <= 15){
        for(int i = 0; i < 4; ++ i){
            if(num & (0x1 << i))
            sum = sum  + pow(2, 3 - i);
        }
    }

    switch(sum){
        case 0: return '0';
        case 1: return '1';
        case 2: return '2';
        case 3: return '3';
        case 4: return '4';
        case 5: return '5';
        case 6: return '6';
        case 7: return '7';
        case 8: return '8';
        case 9: return '9';
        case 10: return 'A';
        case 11: return 'B';
        case 12: return 'C';
        case 13: return 'D';
        case 14: return 'E';
        case 15: return 'F';
    }

    return -1;
}

int main() {
    char buf[1024];
    char temp1[256];
    char temp2[256];

    scanf("%s", temp1);
    scanf("%s", temp2);

    snprintf(buf, sizeof(buf), "%s%s", temp1, temp2);
    for(int i = 0; i < strlen(buf) - 2; i = i + 2){
        for(int j = 0; j < strlen(buf) - 2 - i; j = j + 2){
            if(buf[j] > buf[j + 2]){
                swap(&buf[j], &buf[j + 2]);
            }
        }
    }

    for(int i = 1; i < strlen(buf) - 1; i = i + 2){
        for(int j = 1; j < strlen(buf) - i - 1; j = j + 2){
            if(buf[j] > buf[j + 2]){
                swap(&buf[j], &buf[j + 2]);
            }
        }
    }

    for(int i = 0; i < strlen(buf); ++ i){
        if(buf[i] >= 'a' && buf[i] <= 'f'){
            buf[i] = change(buf[i] - 'a' + 10);
        }else if(buf[i] >= 'A' && buf[i] <= 'F'){
            buf[i] = change(buf[i] - 'A' + 10);
        }else if(buf[i] >= '0' && buf[i] <= '9'){
            buf[i] = change(buf[i] - '0');
        }
    }

    printf("%s", buf);
    return 0;
}


发表于 2024-02-23 15:58:44 回复(0)
都用字典?就不用。整个位操作。
#define mask 0x80 //10000000b 二进制掩码

char reverseChar(char data){
    char dataTemp = data;    //不动data值以备后用
    char res = 0x00;
    for(int i = 0; i < 8; i++){    //循环8次
        res = res >> 1;        //从最高位写入,右移
        //dataTemp 和 mask 按位与后,留下的是 10000000b 或 00000000b
        //和res按位或,把res最高位写入
        res = res | (dataTemp & mask);
        
        dataTemp = dataTemp << 1;//从最高位读出,左移
    }
    return res;
}
函数能不能用没试过(我是懒狗),就是个思路

编辑于 2024-01-23 12:09:44 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <string.h>

void BubbleSort(char* str,int flag,int len)
{
    for(int i = 0;i<(len-1)/2;i++)
    {
        for(int j = flag;j<len-2-2*i;j=j+2)
        {
            if(str[j] - str[j+2]>0)
            {
                char tmp = str[j];
                str[j] = str[j+2];
                str[j+2] = tmp;
            }
        }
    }
}
//把字符转换
void change(char* c)
{
    if(isalpha(*c))
    {
        //先判断字母是否在a~f/A~F范围内
        if (tolower(*c) - 'f' > 0 && tolower(*c) - 'z' <= 0)
            return;
        *c = tolower(*c);
    }
    switch (*c) {
        case '0': *c = '0';break;
        case '1': *c = '8';break;
        case '2': *c = '4';break;
        case '3':*c = 'C';break;
        case '4': *c = '2';break;
        case '5': *c= 'A';break;
        case '6': *c = '6';break;
        case '7': *c = 'E';break;
        case '8': *c = '1';break;
        case '9': *c = '9';break;
        case 'a': *c = '5';break;
        case 'b': *c = 'D';break;
        case 'c': *c = '3';break;
        case 'd': *c = 'B';break;
        case 'e': *c = '7';break;
        case 'f': *c = 'F';break;
    }
}

//对字符串的字符进行转换操作
void turn(char* str,int len)
{
    for(int i = 0;i<len;i++)
    {
        change(&str[i]);
    }
}

int main() {
    char str[2][101] = {'\0'};
    while (scanf("%s", str[0]) != EOF) {
        scanf("%s",str[1]);
        char newstr[201] = {'\0'};
        strcat(newstr, str[0]);
        strcat(newstr, str[1]);
        int len = strlen(newstr);
        BubbleSort(newstr,0, len);
        BubbleSort(newstr,1, len);
        turn(newstr,len);
        printf("%s\n",newstr);
    }
    return 0;
}
发表于 2023-10-10 12:28:24 回复(0)
用例输入:Eqr v9oEb12U2ur4xu7rd931G1f50qDo
预期输出:8084842CAE9B9G7D7BUFooqqrrrvuxu
实际输出:&084842CAE9B9G7D7BUFooqqrrrvuxu
为什么会出现这种情况啊

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char trans(char a) {
    int num, temp = 0, index = 8;
    if (a >= 'a' && a <= 'f') num = a - 'a' + 10;
    else if (a >= 'A' && a <= 'F') num = a - 'A' + 10;
    else if (a >= '0' && a <= '9') num = atoi(&a);
    else return a;
    for (int j = 0; j < 4; j++) {
        temp += (num % 2) * index;
        num /= 2;
        index /= 2;
    }
    if (temp >= 10 && temp <= 15) return (char)(temp - 10 + 'A');
    else return (char)(temp + '0');
}

int main() {
    char str[201] = {'\0'}, str1[201] = {'\0'}, str3[201]={'\0'} , temp;
    int len;
    scanf("%s %s", str, str1);
    strcat(str, str1);
    len = strlen(str);
    for (int i = 0; i < len; i += 2) {
        for (int j = i; j < len; j += 2) {
            if (str[i] > str[j]) {
                temp = str[i];
                str[i] = str[j];
                str[j] = temp;
            }
        }
    }
    for (int i = 1; i < len; i += 2) {
        for (int j = i; j < len; j += 2) {
            if (str[i] > str[j]) {
                temp = str[i];
                str[i] = str[j];
                str[j] = temp;
            }
        }
    }
    for (int i = 0; i < len; i++) {
        str[i] = trans(str[i]);
    }
    printf("%s", str);
    return 0;
}

发表于 2023-09-09 13:34:40 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// compare - 比较函数,用于 qsort 函数排序
int compare(const void* a, const void* b) {
    return *(char*)a - *(char*)b;
}

int main() {
    // 输入两个字符串
    char firstStr[201], secondStr[101];
    scanf("%s%s", firstStr, secondStr);

    // 合并两个字符串
    strcat(firstStr, secondStr);

    // 分别将偶数位和奇数位的字符存入对应数组
    int strLen = strlen(firstStr);
    char odds[strLen / 2], evens[strLen / 2];
    int oddLen = 0, evenLen = 0;

    // 将 firstStr 字符的偶数位和奇数位存入奇偶数组中
    for (int i = 0; i < strLen; i++) {
        if (i % 2) { // 如果 i 是奇数,把当前字符存入 odds 数组
            odds[oddLen++] = firstStr[i];
        } else { // 否则,把当前字符存入 evens 数组
            evens[evenLen++] = firstStr[i];
        }
    }

    // 对偶数位和奇数位的字符进行排序
    qsort(odds, oddLen, sizeof(char), compare);
    qsort(evens, evenLen, sizeof(char), compare);

    // 将排序后的偶数位和奇数位的字符重新插入到 firstStr 中,并对十六进制字符进行加密输出。
    oddLen = 0, evenLen = 0;
    for (int i = 0; i < strLen; i++) {
        if (i % 2) { // 如果 i 是奇数,把 odds 数组中的字符插入 firstStr 中
            firstStr[i] = odds[oddLen++];
        } else { // 否则,把 evens 数组中的字符插入 firstStr 中
            firstStr[i] = evens[evenLen++];
        }

        if (isxdigit(firstStr[i])) { // 如果当前字符是十六进制字符
            char hexStr[] = {firstStr[i], '\0'};
            int num = strtol(hexStr, NULL, 16);
            // 对十六进制字符进行加密
            int encrypted = (num & 1) << 3 | (num & 2) << 1 | (num & 4) >> 1 | (num & 8) >> 3;
            printf("%X", encrypted); // 输出加密后的十六进制字符
        } else { // 否则,直接输出当前字符
            printf("%c", firstStr[i]);
        }
    }
    return 0;
}

发表于 2023-03-25 15:50:51 回复(0)
#include <stdio.h>

int main ()
{
  char buf[200] ={0};
  int len = 0, i, j;
  char sw[16] = {'0','8','4','C','2','A','6','E','1','9','5','D','3','B','7','F'};
  
  while(scanf("%s", &buf[len]) != EOF)
    len += strlen(&buf[len]);
  
  for(i = 0; i < len - 1; i++)
  {
    for(j = i + 2; j < len; j += 2)
    {
      if(buf[i] > buf[j])
      {
        buf[i] ^= buf[j];
        buf[j] ^= buf[i];
        buf[i] ^= buf[j];
      }
    }
    
    if(buf[i] >= 'a' && buf[i] <= 'f')
      buf[i] = buf[i] - 'a' + 10;
    else if(buf[i] >= 'A' && buf[i] <= 'F')
      buf[i] = buf[i] - 'A' + 10;
    else if(buf[i] >= '0' && buf[i] <= '9')
      buf[i] = buf[i] - '0';
    
    if(buf[i] < 16)
      buf[i] = sw[buf[i]];
  }

  printf("%s", buf);
}

发表于 2022-07-20 11:57:45 回复(2)
#include <stdio.h>
#include <string.h>

int cmpfunc(char *a, char *b)
{
    return *a - *b;
}
char change(char a)
{
    switch(a) {
        case '0' :
            return '0';
            break;
        case '1' :
            return '8';
            break;
        case '2' :
            return '4';
            break;
        case '3' :
            return 'C';
            break;
        case '4' :
            return '2';
            break;
        case '5' :
            return 'A';
            break;
        case '6' :
            return '6';
            break;
        case '7' :
            return 'E';
            break;
        case '8' :
            return '1';
            break;
        case '9' :
            return '9';
            break;
        case 'A' :
        case 'a' :
            return '5';
            break;
        case 'B':
        case 'b' :
            return 'D';
            break;
        case 'C' :
        case 'c' :
            return '3';
            break;
        case 'D' :
        case 'd' :
            return 'B';
            break;
        case 'E' :
        case 'e' :
            return '7';
            break;
        case 'F':
        case 'f' :
            return 'F';
            break;
        default :
            return a;
            break;
    }
}

void revert(char *s, int len)
{
    int i = 0;
    for (i = 0; i < len; i++) {
        if (s[i] > 'F' && s[i] <= 'Z') {
            continue;
        }
        if (s[i] > 'f') {
            continue;
        }
        char tmp = change(s[i]);
        s[i] = tmp;
    }
}
int main()
{
    char str1[100] = { 0 };
    char str2[200] = { 0 };
    char str3[200] = { 0 };
    int i = 0;
    int len = 0, len1 = 0, len2 = 0, len3 = 0;
    scanf("%s %s", str1, str2);
    //printf("src:\n%s\n%s\n", str1, str2);
    strcat(str3, str1);
    strcat(str3, str2);
    memset(str1, 0, 100);
    memset(str2, 0, 100);
    len3 = strlen(str3);
    //printf("str3[%d]:%s\n", len3, str3);

    for (i = 0; i < len3; i++) {
        if (i % 2 == 1) {
            str1[len1++] = str3[i];
        }
        if ((i % 2) == 0) {
            str2[len2++] = str3[i];
        }
        str3[i] = 0;
    }
    //printf("ji ou:%s, %s\n", str1, str2);
    qsort(str1, len1, sizeof(char), cmpfunc);
    qsort(str2, len2, sizeof(char), cmpfunc);
    //printf("qsort:[%d]%s, [%d]%s\n", len1, str1, len2, str2);
    len3 = 0;
    len = len1 < len2 ? len1 : len2;
    for (i = 0; i < len; i++) {
        str3[len3++] = str2[i];
        str3[len3++] = str1[i];
    }

    str3[len3] = str2[i];
    revert(str3, len3);
    printf("%s\n", str3);
    
    return 0;
}

发表于 2022-06-09 23:53:40 回复(0)
#include <stdio.h>
#include <string.h>
#define    N    100
void sort(int opt,char str[],int len)
{
    int i,j,min;
    char ch;
    for(i=opt;i<len;i++)
    {
        min=i;
        for(j=i+2;j<len;j+=2)
        {
            if(str[j]<str[min])
                min=j;
        }
        if(min!=i)
        {
            ch=str[i];
            str[i]=str[min];
            str[min]=ch;
        }
    } 
}
void transformation(char str[])
{
    int num,i=0,j,temp[4];
    while(str[i]!='\0')
    {
        if((str[i]>='0'&&str[i]<='9')||(str[i]>='a'&&str[i]<='f')
           ||(str[i]>='A'&&str[i]<='F'))
        {
            for(j=0;j<4;j++)
                temp[j]=0;
            if(str[i]>='0'&&str[i]<='9')
                num=str[i]-'0';
            else if(str[i]>='a'&&str[i]<='f')
                num=str[i]-'a'+10;
            else
                num=str[i]-'A'+10;
            j=0;
            while(num>0)
            {
                temp[j++]=num&1;
                num>>=1;
            }
            for(j=0;j<4;j++)
            {
                num*=2;
                num+=temp[j];
            }
            if(num<=9)
                str[i]=num+'0';
            else
                str[i]=num-10+'A';
        }
        i++;
    }
}
int main()
{
    char str[2*N],str1[N],ch;
    int i,j,min,len;
    scanf("%s%s",str,str1);
    //合并字符串
    strcat(str,str1);
    len=strlen(str);
    //偶数下标的字符进行排序
    sort(0,str,len);
    //奇数下标的字符进行排序
    sort(1,str,len);
    //字符串转换
    transformation(str);
    printf("%s\n",str);
    return 0;
}

发表于 2022-04-25 18:35:33 回复(0)
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int reverse_bit(int num)
{//这里要牢记
    int res=0,i,j,tmp[4]={0};
    for(i=0;i<4;i++)
    {
        tmp[i] =num%2;
        num>>=1;//相当于num=num/2;
        if(num==0)
            break;
    }
     for(i=0;i<4;i++)
    {
         res =(res*2 +tmp[i] );
     }
    return res;
    
}
void change(char *s)
{
    int i,num;
    for(i=0;i<strlen(s);i++)
    {
        if(s[i]>='A' && s[i] <='F')
            num =s[i]-'A'+10;
        else if(s[i]>='a' && s[i] <='f')
            num = s[i]-'a'+10;
        else if(isdigit(s[i]))
            num =s[i]-'0';
        else
        {
            printf("%c",s[i]);
            continue;
        }
            
        num = reverse_bit(num);
        if(num<10)
            printf("%c",num+'0');
        else
            printf("%c",num-10+'A');
    }
    
}
int main()
{
    char s1[101],s2[101],s[200],c;
    int i,j,p;
    scanf("%s %s",s1,s2);
   // scanf("");
    strcat(s1, s2);
    for(i=0;i<strlen(s1)-2;i+=2)
    {//奇数位置进行排序
        p=i;
        for(j=i+2;j<strlen(s1);j+=2)
        {
            if(s1[p]>s1[j])
                p=j;
        }
        if(p!=i)
        {
            c=s1[p];
            s1[p]=s1[i];
            s1[i] =c;
            
        }
    }
    for(i=1;i<strlen(s1)-2;i+=2)
    {//偶数位置进行排序
        p=i;
        for(j=i+2;j<strlen(s1);j+=2)
        {
            if(s1[p]>s1[j])
                p=j;
        }
        if(p!=i)
        {
            c=s1[p];
            s1[p]=s1[i];
            s1[i] =c;
            
        }
    }
    change(s1);
        
    
}





发表于 2022-04-22 22:32:12 回复(0)
#include<stdio.h>
#include<string.h>
#include<math.h>
#define Size 256
void swap(char *a,char *b){
    char t=*a;
    *a=*b,*b=t;
}
void jinzhi(char a)
{
    int t;
    int b[16]={0};
    int c[16]={0};
    if((a>='0'&&a<='9')||(a>='a'&&a<='f')||(a>='A'&&a<='F')){
        if(a>='0'&&a<='9')t=a-48;
        else if(a>='a'&&a<='f')t=a-97+10;
        else if(a>='A'&&a<='F')t=a-65+10;
        int i=0;
        while(t){
            b[i++]=t%2;
            t/=2;
        }

        int sum=0;
        for(int j=0;j<4;j++){
            int m=b[j]*pow(2,4-j-1);
            sum+=m;
        }
        if(sum>=0&&sum<=9)printf("%d",sum);
        else{
            printf("%c",sum+55);
        }

    }else{
        printf("%c",a);
    }
}


int main()
{
    char str1[Size]={0};
    char str2[Size]={0};
    while(scanf("%s %s",str1,str2)!=EOF){
        strcat(str1,str2);
        char ji[Size]={0};
        char ou[Size]={0};
        //奇数下标的取值和排序
        for(int i=1,j=0;i<strlen(str1);i+=2){
            ji[j++]=str1[i];
        }
        for(int i=0;i<strlen(ji);i++){
            for(int j=i+1;j<strlen(ji);j++){
                if(ji[i]>ji[j])swap(&ji[i],&ji[j]);
            }
        }
        //偶数下标取值和排序
        for(int i=0,j=0;i<strlen(str1);i+=2){
            ou[j++]=str1[i];
        }
        for(int i=0;i<strlen(ou);i++){
            for(int j=i+1;j<strlen(ou);j++){
                if(ou[i]>ou[j])swap(&ou[i],&ou[j]);
            }
        }
        //得到排序后的字符
        char str[Size]={0};
        for(int i=0,j=1;i<strlen(ji);i++,j+=2)str[j]=ji[i];
        for(int i=0,j=0;i<strlen(ou);i++,j+=2)str[j]=ou[i];

        //进行进制转换
        for(int i=0;i<strlen(str);i++){
            jinzhi(str[i]);
        }
        printf("\n");
    }
    return 0;
}

发表于 2022-01-30 03:18:19 回复(0)
越暴力越简单
#include <stdio.h>
#include <string.h>
/*
step1:暴力scanf
step2:间隔为2的选择排序
step3:暴力字典映射
*/
char dic1[] ={"0123456789abcdefABCDEF"};
char dic2[] ={"084C2A6E195D3B7F5D3B7F"};

void selectSort(char * in, int beginIndex);

int main(void)
{
    char in[202];
 
    while( scanf("%s ", in) !=EOF && 
           scanf("%s\n", in + strlen(in) ) != EOF )
    {
        selectSort(in, 0);
        selectSort(in, 1);
    
        for(int i=0; i<strlen(in); i++){        //字典映射替换
            if('0' <= in[i] && in[i] <= '9' ||
               'a' <= in[i] && in[i] <= 'f' ||
               'A' <= in[i] && in[i] <= 'F' )
                in[i] = dic2 [ strchr( dic1 , in[i] ) - dic1 ];
        }
        printf("%s\n", in);
    }
          
    return 0;
}

void selectSort(char * in, int beginIndex)
{
    for(int i=beginIndex; i<strlen(in)-1; i+=2){
        char tmp;
        int s=i;
        for(int j=i+2; j<strlen(in); j+=2){
            if(in[j]<in[s]){
                s = j;
            }
        }
        tmp = in[i];
        in[i] = in[s];
        in[s] = tmp;
    }
}


发表于 2022-01-09 22:18:55 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char func(char str)
{
    int temp;
    if(str<='9'&&str>='0')
    {
        temp=str-'0';
    }
    else if(str<='f'&&str>='a')
    {
        temp=str-'a'+10;
    }
    else if(str<='F'&&str>='A')
    {
        temp=str-'A'+10;
    }
    int bin[4]={0};
    int i=0;
    while(temp!=0)
    {
        bin[i++]=temp%2;
        temp/=2;
    }
    temp=bin[0]*pow(2,3)+bin[1]*pow(2,2)+bin[2]*pow(2,1)+bin[3]*pow(2,0);
    char result;
    if(temp>9)
    {
        result=temp-10+'A';
    }
    else
    {
        result=temp+'0';
    }
    return result;
}
int main()
{
    char input[1000];
    int i,j;
    while(gets(input))
    {
        int len=strlen(input);
        for(i=0;i<len;i++)
        {
            if(input[i]==' ')
            {
                for(j=i;j<len-1;j++)
                {
                    input[j]=input[j+1];
                }
                input[len-1]='\0';
                break;
            }
        }
        len=strlen(input);
        for(i=0;i<len-2;i=i+2)
        {
            for(j=0;j<len-2-i;j=j+2)
            {
                if(input[j]>input[j+2])
                {
                    char temp;
                    temp=input[j];
                    input[j]=input[j+2];
                    input[j+2]=temp;
                }
            }
        }
        for(i=0;i<len-2;i=i+2)
        {
            for(j=1;j<len-2-i;j=j+2)
            {
                if(input[j]>input[j+2])
                {
                    char temp;
                    temp=input[j];
                    input[j]=input[j+2];
                    input[j+2]=temp;
                }
            }
        }
        for(i=0;i<len;i++)
        {
            if((input[i]<='9'&&input[i]>='0')||(input[i]<='f'&&input[i]>='a')||(input[i]<='F'&&input[i]>='A'))
            {
                input[i]=func(input[i]);
            }
        }
        printf("%s\n",input);
    }
    return 0;
}

发表于 2021-07-15 15:18:04 回复(1)