首页 > 试题广场 >

字符串合并处理

[编程题]字符串合并处理
  • 热度指数:209633 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}定义“调整”操作为,对于一个十进制数字,将其转换为二进制数,翻转,再转换为十六进制数(大写)。例如,(\texttt{4})_{10} 对应的二进制数为 (\texttt{100})_2 ,翻转后得到 (\texttt{001})_2 ,再转换为十六进制数为 (\texttt{1})_{16}

\hspace{15pt}对于给定的仅由小写字母 \texttt{a-f} 、大写字母 \texttt{A-F} 、数字 \texttt{0-9} 构成的字符串 st ,请按照以下步骤进行处理:
\hspace{23pt}\bullet\,第一步,将 st 合并,形成一个新字符串 u
\hspace{23pt}\bullet\,第二步,将 u 中奇数位字符从小到大进行排序,随后将偶数位字符也从小到大进行排序,得到 u'
\hspace{23pt}\bullet\,第三步,对 u' 中的字符依次转换为十进制数,随后执行“调整”操作。
\hspace{15pt}输出最终的字符串。

输入描述:
\hspace{15pt}在一行上输入两个长度 1 \leqq {\rm length}(s), {\rm length}(t) \leqq 100 ,仅由小写字母 \texttt{a-f} 、大写字母 \texttt{A-F} 、数字 \texttt{0-9} 构成的字符串 st ,代表待处理的字符串。


输出描述:
\hspace{15pt}在一行上输出一个字符串,代表最终的字符串。
示例1

输入

dec fab

输出

5D37BF

说明

\hspace{15pt}在这个样例中,第一步合并后得到 u = \texttt{ ;第二步,排序得到 u' = \texttt{ ;随后,按位转换为十进制数,并执行“调整”操作:
\hspace{23pt}\bullet\,对于第一个字符 (\texttt{ ,其十进制数为 (10)_{10} ,二进制数为 (\texttt{1010})_2 ,翻转后得到 (\texttt{0101})_2 ,再转换回十六进制数为 (\texttt{5})_{16}
\hspace{23pt}\bullet\,对于第二个字符 (\texttt{ ,翻转后得到 (\texttt{1101})_2=(\texttt{D})_{16}
\hspace{23pt}\bullet\,对于第三个字符 (\texttt{ ,翻转后得到 (\texttt{0011})_2=(\texttt{3})_{16}
\hspace{23pt}\bullet\,对于第四个字符 (\texttt{ ,翻转后得到 (\texttt{0111})_2=(\texttt{7})_{16}
\hspace{23pt}\bullet\,对于第五个字符 (\texttt{ ,翻转后得到 (\texttt{1011})_2=(\texttt{B})_{16}
\hspace{23pt}\bullet\,对于第六个字符 (\texttt{ ,翻转后得到 (\texttt{1111})_2=(\texttt{F})_{16}
示例2

输入

ab CD

输出

3B5D

说明

\hspace{15pt}在这个样例中,第一步合并后得到 u = \texttt{ ;第二步,排序得到 u' = \texttt{ 。需要特别注意的是,这里的排序是按照 \sf{Ascii} 码表的顺序进行排序的。
示例3

输入

123 15

输出

88C4A
又是一道垃圾题,题干说输入“仅由”数字和abcdef,然后给我一大堆uvwxyz,真恶心
就这样吧
发表于 2025-01-17 03:21:08 回复(0)
不是说字母是a-f A-F吗,测试用例里怎么会有之外的,也没说怎么处理啊
# 取二进制
def get_bin(str):
    str_bin = bin(int(str))[2:].rjust(4, "0")
    return str_bin


# 取十六进制
def get_hex(str):
    str_hex = hex(int(str))[2:]
    return str_hex


# 操作
def trans(s):
    # letter位置内容:(0,d)
    letter = [(index, str) for index, str in enumerate(s)]
    # letter
    letter1 = []
    letter2 = []
    sort = ""
    for i in letter:
        if i[0] % 2 == 0:
            letter1.append(i)
        else:
            letter2.append(i)
    sort1 = sorted(letter1, key=lambda x: x[1])
    sort2 = sorted(letter2, key=lambda x: x[1])
    for i in range(len(s)):
        if i % 2 == 0:
            sort += sort1[0][1]
            del sort1[0]
        else:
            sort += sort2[0][1]
            del sort2[0]
    return sort


# 二进制取反转16进制
def rev(s):
    str = ""
    for i in range(len(s) - 1, -1, -1):
        str += s[i]
    str = int(str, 2)
    str = get_hex(str)
    return str


str1, str2 = input().split()
s = str1 + str2
s = trans(s)
str = ""
dic = {
    "1": "1",
    "2": "2",
    "3": "3",
    "4": "4",
    "5": "5",
    "6": "6",
    "7": "7",
    "8": "8",
    "9": "9",
    "A": "10",
    "B": "11",
    "C": "12",
    "D": "13",
    "E": "14",
    "F": "15",
}
p=[]
for i in s:
    u = i.upper()
    if u not in dic.keys():
        continue
    p.append( rev(get_bin(int(dic[u]))) )

for i in p:
    print(i.upper(),end="")

发表于 2025-01-07 18:27:35 回复(0)
评论区学到的:
把字符串转换成list,方便进行赋值操作,如果把奇数和偶数角标的字符串分别储存到新的列表中,再用zip合并一个列表,容易出现漏存现象。
leven = sorted(l[0::2])
lodd = sorted(l[1::2])
lnew = []
fori,j in zip(leven, lodd):
    lnew.append(i)
    lnew.append(j)
iflen(leven) != len(lodd):
    lnew.append(leven[-1])

新方法的代码:
l = list(''.join(input().split()))
# 排序
lnew = '0'*len(l)
l[::2] = sorted(l[0::2])
l[1::2] = sorted(l[1::2])

# 转换
snew = ''
for i in lnew:
    if i.isdigit():
        base2 = bin(int(i))[2:]
        while len(base2) <4:
            base2 = '0' + base2
        base2 = base2[::-1]
        inew = hex(int(base2, 2))[2:].upper()
        snew += str(inew)
    elif i in 'abcedf'&nbs***bsp;i in 'ABCEDF':
        base2 = bin(int(i, 16))[2:][::-1]
        inew = hex(int(base2, 2))[2:].upper()
        snew += str(inew)
    else:
        snew += i
print(snew)


发表于 2024-12-13 18:06:37 回复(0)
str1,str2 = input().split()
s = list(str1+str2)
#字符排序
s1 = s[::2]#偶数
s1.sort()
s2 = s[1::2]#奇数
s2.sort()
s[::2] = s1
s[1::2] = s2
#字符转换
res = []
for i in s:
    if '0'<=i<='9'&nbs***bsp;'a'<=i<='f'&nbs***bsp;'A'<=i<='F':
        j = bin(int(i,16))[2:].zfill(4)
        print(hex(int(j[::-1],2))[2:].upper(),end='')
    else:
        print(i,end='')

发表于 2024-09-29 20:41:47 回复(0)
def change_order(s):
    ji_list = []
    ou_list = []

    for i in range(len(s)):
        if i % 2 == 0:
            ou_list.append(s[i])
        else:
            ji_list.append(s[i])

    ji_list.sort()
    ou_list.sort()

    for x in range(len(ji_list)):
        ou_list.insert(2 * x + 1, ji_list[x])

    return ''.join(ou_list)

def change_chr(i):
    if i.isdigit() or 'A' <= i.upper() <='F':
        s = '0b'
        y = bin(int(i, 16))[2:]
        if i.isdigit() and len(y) < 4:
            y = (4 - len(y)) * '0' + y

        s += y[::-1]

        s = hex(int(s, 2))[2:]
        return s.upper()

    else:
        return i

def change_code(n):
    s_list = []
    for i in n:
        s_list.append(change_chr(i))

    return ''.join(s_list)

print(change_code(change_order(input().replace(" ", ""))))
发表于 2024-08-01 09:21:51 回复(0)
str1,str2=input().strip().split()
list1=str(str1)+str(str2)
m=[]
n=[]
for i in range(len(list1)):
    if i%2==0:
        m.append(list1[i])
    elif i%2!=0:
        n.append(list1[i])
#此时m为d,c,a.  n为e,f,b
m.sort()
n.sort()
list2=m+n
list2[::2]=m
list2[1::2]=n
# print(list2) #此时字符串为abcedf
list3=[]
for i in list2:
    list3.append(bin(int(i,16)))
# print(list3)
list4=[]
for i in list3:
    i=i[:1:-1]
    list4.append(i)
list5=[]
for i in list4:
    i=hex(int(i,2))
    list5.append(i[-1::])
# str(list5).replace(',','')
for i in list5:
    if i.lower():
        i=i.upper()
    print(i,end='')
自己琢磨写出来的,很多地方都是走捷径走出来的,应该没人和我一样这么麻烦的
发表于 2024-05-09 21:53:35 回复(1)
这题就是一个没任何算法,主要考逻辑操作的题目
def odd_even_str_sort(s):
    # 将字符串按奇数和偶数索引进行分割
    s_odd = ""
    s_even = ""
    for i, char in enumerate(s):
        if i % 2 == 0:
            s_even += char
        else:
            s_odd += char

    # 对每个部分进行排序
    s_even_sort = sorted(s_even)
    s_odd_sort = sorted(s_odd)

    # 交替组合排序后的结果
    result = ""
    max_length = max(len(s_even_sort), len(s_odd_sort))
    for i in range(max_length):
        if i < len(s_even_sort):
            result += s_even_sort[i]
        if i < len(s_odd_sort):
            result += s_odd_sort[i]

    return result


def zhuanhuan(s):
    # 转换字符串中的字符
    result = ""
    for char in s:
        # 检查是否为十六进制字符
        if char.isdigit()&nbs***bsp;("a" <= char.lower() <= "f"):
            # 将十六进制字符转为二进制
            binary = bin(int(char, 16))[2:].zfill(4)  # 二进制左侧补0
            # 反转二进制
            reversed_binary = binary[::-1]
            # 将反转后的二进制转回十六进制
            reversed_hex = hex(int(reversed_binary, 2))[2:].upper()
            result += reversed_hex
        else:
            result += char

    return result


# 读取输入并移除空白字符
s = "".join(input().split())

# 先进行奇偶排序,再转换字符
sorted_str = odd_even_str_sort(s)
converted_str = zhuanhuan(sorted_str)

# 打印最终结果
print(converted_str)

发表于 2024-05-04 20:49:19 回复(0)
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)