题解 | #字符串合并处理#
字符串合并处理
https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
package main
import (
"fmt"
)
func main() {
var str1, str2 string
fmt.Scan(&str1, &str2)
// 第一步:合并
str1 += str2
// 第二步:奇偶下标分别排序
str1 = selectSort(0, selectSort(1, str1))
// 第三步:转换 16进制 -> 2进制 -> 逆序 -> 十六进制
letters := []byte(str1)
for i, letter := range letters {
if (letter >= '0' && letter <= '9') ||
(letter >= 'a' && letter <= 'f') ||
(letter >= 'A' && letter <= 'F') {
letters[i] = parseLetter(letter)
}
}
fmt.Println(string(letters))
}
func parseLetter(letter byte) byte {
// 十六进制数
var number int
switch letter {
case 'a', 'b', 'c', 'd', 'e', 'f':
number = int(letter - 'a' + 10)
case 'A', 'B', 'C', 'D', 'E', 'F':
number = int(letter - 'A' + 10)
default:
number = int(letter - '0')
}
// 到此转化为了对应的十进制, 进一步转化2进制并存储
binary := make([]int, 4)
for i := 3; i >= 0; i-- {
if number&1 == 1 {
binary[i] = 1
}
number >>= 1
}
// 将binary逆序
for i := 0; i < len(binary)/2; i++ {
binary[i], binary[len(binary)-1-i] = binary[len(binary)-1-i], binary[i]
}
number = 0
// 求和逆序后的十进制
bit := 1
for i := 3; i >= 0; i-- {
number += bit * binary[i]
bit <<= 1
}
// 十进制转化为十六进制
switch number {
case 10, 11, 12, 13, 14, 15:
return 'A' + byte(number-10)
default:
return '0' + byte(number)
}
}
// 只排序奇偶位置
func selectSort(start int, message string) string {
array := []byte(message)
for i := start; i < len(array); i += 2 {
for j := i + 2; j < len(array); j += 2 {
if array[i] > array[j] {
array[i], array[j] = array[j], array[i]
}
}
}
return string(array)
}
查看28道真题和解析