首页 > 试题广场 >

字符串合并处理

[编程题]字符串合并处理
  • 热度指数: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
string = input().replace(' ', '')

list_024 = sorted(string[0::2])
list_135 = sorted(string[1::2])

step_2 = ''
for i in range(len(string)):
    if i % 2 == 0:
        step_2 += list_024[int(i/2)]
    else:
        step_2 += list_135[int((i-1)/2)]

step_3 = ''
for s in step_2:
    if '0' <= s <='9'&nbs***bsp;'A' <= s <= 'F'&nbs***bsp;'a' <= s <= 'f':
        s_10_a = int(s, 16)
        s_2 = bin(s_10_a)[2:].rjust(4, '0')
        s_2_reverse = s_2[::-1]
        s_10_b = int(s_2_reverse, 2)
        s_16 = hex(s_10_b)[2:]
        if s_16.isdigit():
            step_3 += s_16
        else:
            step_3 += s_16.upper()
    else:
        step_3 += s

print(step_3)

编辑于 2024-04-24 14:45:54 回复(0)
string = "".join(input().strip().split())

even = [string[i] for i in range(0,len(string),2)]
odd = [string[i] for i in range(1,len(string),2)]

sort_even = sorted([ord(i) for i in even])
sort_odd = sorted([ord(i) for i in odd])

new_str = [sort_even[i//2]  if i%2==0 else sort_odd[i//2] for i in range(len(string))]

result = ''
for i in new_str:
    if chr(i).isnumeric() or (i>=65 and i<=70) or\
                (i>=97 and i<=102):
        new_i = hex(int(bin(
            int(chr(i),base=16)).replace("0b","").rjust(4,"0")[::-1],base=2)).replace("0x","").upper()
        result += new_i
    else:
        result += chr(i)


print(result)
发表于 2023-10-17 19:22:45 回复(0)
# 定义 16进制 和 2进制 转换的字典  方便快速转换
di_2_16, di_16_2 = {}, {}
for i in list(range(16)):
    di_2_16[bin(i)[2:].rjust(4, '0')] = str(i) if i < 10 else chr(i + 55)
    di_16_2[str(i) if i < 10 else chr(i + 55)] = bin(i)[2:].rjust(4, '0')

# 处理键盘输入
s = ''.join(input().split())
s1, s2 = sorted(s[0::2]), sorted(s[1::2])

# 奇偶位置处理
ss = ''
for i in range(len(s2)):
    ss += s1[i] + s2[i]
else:
    ss += '' if len(s1) == len(s2) else s1[-1]

# 逐个转换  利用列表实现逐个替换
ss_li = list(ss)
for i in range(len(ss_li)):
    if ss_li[i].upper() if ss_li[i].islower() else ss_li[i] in list(di_16_2.keys()):
        if ss_li[i].upper() if ss_li[i].islower() else ss_li[i]:
            ss_li[i] = di_2_16.get(di_16_2.get(ss_li[i].upper() if ss_li[i].islower() else ss_li[i])[::-1])
            
print(''.join(ss_li))



上述代码哪里有问题呀 ......就是通不过全部......
哪位大佬给看看, 不胜感激, 

发表于 2023-08-23 15:49:56 回复(1)
import re
word=''.join(input().split())
odd=word[::2] # 奇数
even=word[1::2] # 偶数
odd_sort=''.join(sorted(odd)) #分别排序
even_sort=''.join(sorted(even))
str_1=''
for i in range(max(len(odd_sort),len(even_sort))): #将排序后的结果依次加入
    str_1+=odd_sort[i]
    if i<=len(even_sort)-1:
        str_1+=even_sort[i]

str_list=[i for i in str_1]
for i in range(len(str_list)):  # 转化
    if re.findall('[A-Fa-f0-9]',str_list[i],re.S): #re判断A-F、a-f、0-9
        a=int(str_list[i],16) #16——>10——>2(逆序)——>10——>16
        b='0'*(4-len(str(bin(a))[2:]))+str(bin(a))[2:]
        c=b[::-1]
        str_list[i]=str(hex(int(c,2)))[2:].upper()
    else:
        pass
print(''.join(str_list))
发表于 2023-08-06 16:57:49 回复(0)
def fn(s):   # 字符转换
    k = ord(s)
    if k>=48 and k<=57&nbs***bsp;k>=65 and k<=70&nbs***bsp;k>=97 and k<=102:
        a = int(s,16)
        l = ['0','0','0','0']
        if a >= 8:
            a %= 8
            l[3] = '1'
        if a >= 4:
            a %= 4
            l[2] = '1'
        if a >= 2:
            a %= 2
            l[1] = '1'
        if a == 1:
            l[0] = '1'
        a_new = int(''.join(l),2)
        s_new = hex(a_new)[-1].upper()
        return s_new
    else:
        return s

line = input().split(' ')
line = list(line[0]+line[1])

lo = []
lj = []

for i in range(len(line)):
    if i % 2 == 0:
        lo.append(line[i])
    else:
        lj.append(line[i])
lo.sort()
lj.sort()
line1 = []
for i in range(len(lo)):
    line1.append(lo[i])
    if i < len(lj):
        line1.append(lj[i])
for i in range(len(line1)):
    line1[i] = fn(line1[i])

print(''.join(line1))

发表于 2023-07-19 19:15:45 回复(0)
import sys


d = {'10':'A','11':'B','12':'C','13':'D','14':'E','15':'F',\
     'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
s1 = ""
s2 = ""
l1 = [] # 奇数
l2 = [] # 偶数
s = input().strip().split()
s = s[0]+s[1]


# 按下表拆解排序/枚举
for i,j in enumerate(s):
    # 奇偶判断
    if i&1 == 1: # 奇数
        l1.append(j)
    else:
        l2.append(j)
# 排序
l1.sort()
l2.sort()

# 合并
for i,j in zip(l2,l1):
    s1=s1+i+j
# l1,l2长度不一样,会丢失一个元素 
if len(l1)>len(l2):
    s1+=l1[-1]
elif len(l2)>len(l1):
    s1+=l2[-1]


for i in s1:
    if i.isdigit():
        m = int(str(bin(int(i))).replace('0b','').rjust(4,'0')[::-1],2)
        if m>=10:
            s2 += d[str(m)]
        else:
            s2+=str(m)

    elif i in "ABCDEFabcdef":
        i = i.upper()
        n = int(str(bin(int(d[i]))).replace('0b','').rjust(4,'0')[::-1],2)
        if n>=10:
            s2+= d[str(n)]
        else:
            s2+=str(n)
    else:
        s2+=i

print(s2)


发表于 2023-07-01 16:08:38 回复(0)
def reverse_hex(char:str):
    if char in 'abcdefABCDEF'&nbs***bsp;char.isdigit():
        num_b = bin(int(char, base=16))[2:].zfill(4)[::-1]
        num_h = hex(int(num_b, base=2))[2:].upper()
        return num_h
    else: return char

strs = list(input().replace(' ', '')) #字串合并
strs[::2] = sorted(strs[::2]) #偶数索引字串排序
strs[1::2] = sorted(strs[1::2]) #奇数索引字串排序
f_res = ''.join([reverse_hex(c) for c in strs]) #转16进制
print(f_res)

发表于 2023-06-26 18:14:57 回复(0)
# 第一步:
s = ''.join(input().split())
# 第二步:
ou_li = [i for idx, i in enumerate(s) if idx % 2 == 0]
ji_li = [i for idx, i in enumerate(s) if idx % 2 == 1]
sort_list = [0] * len(s)
# 考虑 不相等元素序列
for idx, o in zip(range(0, len(s), 2), sorted(ou_li)):
    sort_list[idx] = o
for idx, j in zip(range(1, len(s), 2), sorted(ji_li)):
    sort_list[idx] = j
# 新字符串
new_s = ''.join(sort_list)
# 第三步:
ret = ''
for i in new_s.upper():
    x1 = int(i, 16)  # 将字符转换为16进制
    x2 = bin(x1)[2:].zfill(4)  # 将10进制转换为2进制,去除前2个符号,并保留4位
    x3 = x2[::-1]  # 字符串倒序
    x4 = int(x3, 2)  # 将二进制转换为10进制
    x5 = hex(x4)[2:]  # 将10进制在转换16进制,去除前2个符号
    ret += x5.upper()  # 将结果转换为大写字母,拼到结果字符串
print(ret)
发表于 2023-05-11 23:35:21 回复(1)
# 输入两个字符串再合并
str1, str2 = input().split()
str3 = str1 + str2
# 下标奇偶数分别从小到大排序,再按奇偶数拼接字符串(奇数odd偶数even)
even = sorted(str3[::2])
odd = sorted(str3[1::2])
str4 = "".join(e + o for e, o in zip(even,odd))
# (e + o)是表达式,指在for循环中的变量进行拼接;(for e,o in zip(even,odd))指循环从zip中并列取两个字符,然后运行e+o进行拼接
if len(str3) % 2 != 0:
    str4 += even[-1]

# 字符转换规则:(字符,十六进制)转换成二进制再倒序,倒序后的二进制转换成十六进制大写字符
str5 = ""
for i in str4:
    if (i >= '0' and i <= '9')&nbs***bsp;(i >= 'A' and i <= 'F')&nbs***bsp;(i >= 'a' and i <= 'f'):
        int2 = bin(int(i, 16))[2:].zfill(4)[::-1]   # int整形,bin转换二进制且结果以'0b'开头需去掉,zfill二进制不足4位填充,[::-1]倒序排序
        int16 = hex(int(int2,2))[2:].upper()    # hex转换十六进制,upper转换大写字母
        str5 += "".join(int16)
    else:
        str5 += "".join(i)

# 转换完成后的字符拼接输出
print(str5)

发表于 2023-04-24 10:34:42 回复(0)
def sort_oddeven(text:str)->str:
    res_o=''
    res_e=''
    for i,s in enumerate(text):
        if (i+1)%2==1:
            res_o+=s
        else:
            res_e+=s
    res_e=''.join(sorted(res_e))
    res_o=''.join(sorted(res_o))
    res,lo,le='',len(res_o),len(res_e)
    for i in range(lo+1):
        if i<lo: res+=res_o[i]
        if i<le: res+=res_e[i]
    return res

def transf(text:str)->str:
    res=''
    for s in text:
        try:
            bs=format(int(s,16), '#06b').replace('0b','',1)[::-1]
            hs=hex(int(bs,2)).replace('0x','',1).upper()
            res+=hs
        except:
            res+=s
    return res
text=input().replace(' ','')
text=sort_oddeven(text)
text=transf(text)
print(text)

发表于 2023-04-19 14:08:22 回复(0)
str1,str2=input().split()
str0=str1+str2
a=[]#奇数
b=[]#偶数
c=[]#排序后
for i in range(len(str0)):
    if i%2==0:
        b.append(str0[i])
    elif i%2==1:
        a.append(str0[i])
a=list(sorted(a))
b=list(sorted(b))
for j in range(len(str0)):
    if j%2==0:
        c.append(b[0])
        b=b[1:]
    elif j%2==1:
        c.append(a[0])
        a=a[1:]
for k in range(len(c)):
    if c[k].isalpha():
        if 70>=ord(c[k])>=65&nbs***bsp;102>=ord(c[k])>=97:
            x=bin(int(c[k],16))[2:]
            while len(x)<4:
                x='0'+x
            c[k]=hex(int(x[::-1],2))[2:]
            if c[k].islower():
                c[k]=c[k].upper()
    elif c[k].isdigit():
        y=bin(int(c[k],16))[2:]
        while len(y)<4:
            y='0'+y
        c[k]=hex(int(y[::-1],2))[2:]
        if c[k].islower():
            c[k]=c[k].upper()
print(''.join(c))

发表于 2023-03-17 04:41:30 回复(0)
import sys

for line in sys.stdin:
    a = line.split()

# 第一步:将输入的两个字符串str1和str2进行前后合并
str1=a[0]
str2=a[1]
str3=str1+str2
# print(str3)

# 第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。
even_chars = sorted(str3[::2])
odd_chars = sorted(str3[1::2])
str4 = ''.join(e+o for e,o in zip(even_chars,odd_chars))
# 处理字符串长度为奇数时,多出的字符
if len(str3)%2 != 0:
    str4 += even_chars[-1]
# print(str4)

#第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。转换规则如下:
#对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,
#然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。

str5 = ''
for i in str4:
    # 筛选字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符
    if (i >= '0' and i <= '9') or (i>='A' and i<='F') or (i>='a' and i<='f'):
        #使用int()函数将十六进制字符串转换为整数,然后使用bin()函数将整数转换为二进制字符串。但是,请注意,bin()函数返回的二进制字符串前两个字符是0b,因此我们使用切片[2:]来删除这两个字符,只返回纯二进制字符串;zfill(4)填充为4位;[::-1]倒序。
        int2 = bin(int(i, 16))[2:].zfill(4)[::-1]
        int16 = hex(int(int2,2))[2:].upper()
        str5 += ''.join(int16)
    else:
        str5 += ''.join(i)
print(str5)
发表于 2023-03-16 15:05:29 回复(0)
a=list(input().replace(' ',''))
a[::2]=sorted(a[::2])
a[1::2]=sorted(a[1::2])
result=''
for i in a:
    if 'a'<=i.lower()<='f'&nbs***bsp;'0'<=i<='9':
        p=bin(int(i,16))[2::]
        p=p.rjust(4,'0')[::-1]
        p=hex(int(p,2))[2:]
        result+=p.upper()
    else:
        result+=i
print(result)

发表于 2023-03-04 22:52:46 回复(0)
st=input().split(' ')
st=str(st[0]+st[1])
list1=[]
list2=[]
new_list=[]
for i in range(0,len(st),2):
    list1.append(st[i])
for i in range(1,len(st),2):
    list2.append(st[i])
list1=sorted(list1)
list2=sorted(list2)
for i in range (len(list2)):
    new_list.append(list1[i])
    new_list.append(list2[i])
if len(st)%2==1:
    new_list.append(list1[len(list2)])

dic={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
tran_list=[]

for i in new_list:
    if i.upper() in dic:
        num_t=int('0b'+str(int((bin(dic[i.upper()])[2:].zfill(4))[::-1])),2)
        num_t=hex(num_t)[2:]
        tran_list.append(num_t)
    elif i.isnumeric():
        num_t=int('0b'+str(int((bin(int(i))[2:].zfill(4))[::-1])),2)
        num_t=hex(num_t)[2:]
        tran_list.append(num_t)
    else:
        tran_list.append(i)
for i in tran_list:
    if i.isnumeric():
        print(i,end="")
    elif i.upper() in dic:
        print(i.upper(),end='')
    else:
        print(i,end="")

发表于 2022-12-15 13:44:12 回复(0)
str1,str2=input().split()
str0=str1+str2
n=len(str0)
odd=[]
even=[]
str0=list(str0)
for i in range(n):
    if i%2==0:
        even.append(str0[i])
    else:
        odd.append(str0[i])
even=sorted(even)
odd=sorted(odd)
new_str=[]
for i in range(len(even)):
    try:
        new_str.append(even[i])
        new_str.append(odd[i])
    except:
        break
new_str=''.join(new_str)

res=''
for i in range(n):
    if new_str[i].lower() in '0123456789abcdef':
        er=bin(int(new_str[i],16))[2:]
        dao=er.rjust(4,'0')[::-1]
        shiliu=hex(int(dao,2))[2:].upper()
        res+=shiliu
    else:
        res+=new_str[i]
print(res)


发表于 2022-12-13 13:21:19 回复(0)
s = input().split(' ')
res = s[0] + s[1]
tmp_odd, tmp_old = [], []
for i in range(len(res)):
    if (i + 1) % 2 != 0: # 奇数
        tmp_odd.append(res[i])
    else:
        tmp_old.append(res[i])
tmp_odd1 = sorted(tmp_odd)
tmp_old1 = sorted(tmp_old)

res1, i_odd, i_old = '', 0, 0
for j in range(len(res)):
    if (j + 1) % 2 != 0 and i_odd < len(tmp_odd1):  # 奇数
        res1 += tmp_odd1[i_odd]
        i_odd += 1
    else:
        if i_old < len(tmp_old1):
            res1 += tmp_old1[i_old]
            i_old += 1
res2 = ''
ref = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','a','b','c','d','e','f']
for item in res1:
    if item in ref:
        # 转换为2进制并倒序
        item2 = '0b'+ bin(int(item, 16))[2:].rjust(4, '0')[::-1]
        # 转换为16进制
        item16 = hex(int(item2, 2))[2:].upper()
        res2 += item16
    else:
        res2 += item
print(res2)
关键点:
1、排序并合并(加入列表中,并用sorted排序,用两个指针分别控制两个排序后的奇偶字母列表)
2、字符转换(参考别人的)
发表于 2022-11-30 11:55:22 回复(0)
# step 1
s = list(input().replace(' ', ''))

# step 2
s[::2] = sorted(s[::2])
s[1::2] = sorted(s[1::2])

# step 3
res = ''
for i in s:
    if i.lower() in 'abcdef':
        i = str(int(i, 16))
    if i.isnumeric():
        i = bin(int(i))[2:]
        i = '0' * (4 - len(i)) + i
        i = hex(int(i[::-1], 2))[2:].upper()
    res += i
print(res)

发表于 2022-11-24 15:42:08 回复(0)
import sys

for line in sys.stdin:
    # 第一步,合并字符串转数组
    line = list(line[:-1].replace(" ", ""))
    # 第二部,奇偶位排序
    line[::2] = sorted(line[::2])
    line[1::2] = sorted(line[1::2])
    # 第三步,十进制转十六进制转二进制,然后倒序
    res=""
    for i in line:
        # 转换操作限制在a~fA~F0~9范围内
        if "a" <= i <= "f"&nbs***bsp;"A" <= i <= "F"&nbs***bsp;"0" <= i <= "9":
            """
            int(i,16)十进制转十六进制
            bin(int(i,16))[2:] 十六进制转二进制,去掉开头进制标记符倒叙
            bin(int(i, 16))[2:].rjust(4, "0")[::-1]
                去掉进制符后如果不够4位填充0文本向右对齐(字符串左侧填充)
            hex(int(i,2)) 最后二进制再转十六进制
            """
            res+=hex(int(bin(int(i, 16))[2:].
                rjust(4, "0")[::-1],2))[2:].upper()
        else: res+=i

    print(res)

发表于 2022-09-21 01:15:57 回复(0)