题解 | #字符串合并处理#
字符串合并处理
https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
package main
import (
"fmt"
"sort"
)
func main() {
var str1, str2 string
fmt.Scan(&str1, &str2)
mergedStr := mergeString(str1, str2)
sortedStr := sortString(mergedStr)
convertedStr := convertString(sortedStr)
fmt.Println(convertedStr)
}
// 合并两个字符串
func mergeString(str1, str2 string) string {
return str1 + str2
}
// 字符串进行排序,奇数位和偶数位分别从小到大排序
func sortString(str string) string {
evens := []byte{}
odds := []byte{}
for i := 0; i < len(str); i++ {
if i%2 == 0 {
evens = append(evens, str[i])
} else {
odds = append(odds, str[i])
}
}
sort.Slice(evens, func(i, j int) bool {
return evens[i] < evens[j]
})
sort.Slice(odds, func(i, j int) bool {
return odds[i] < odds[j]
})
result := ""
for i := 0; i < len(str); i++ {
if i%2 == 0 {
result += string(evens[i/2])
} else {
result += string(odds[i/2])
}
}
return result
}
// 字符串中的'0'-'9'、'A'-'F'和'a'~'f'字符进行转换
func convertString(str string) string {
result := ""
for i := 0; i < len(str); i++ {
if isHex(str[i]) {
binary := reverseBinary(str[i])
decimal := binaryToDecimal(binary)
hex := decimalToHex(decimal)
result += hex
} else {
result += string(str[i])
}
}
return result
}
// 判断字符是否为十六进制字符
func isHex(ch byte) bool {
return (ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')
}
// 将十六进制字符转换为二进制字符串并倒序
func reverseBinary(ch byte) string {
var binary string
switch {
case ch >= '0' && ch <= '9':
binary = fmt.Sprintf("%04b", ch-'0')
case ch >= 'A' && ch <= 'F':
binary = fmt.Sprintf("%04b", ch-'A'+10)
case ch >= 'a' && ch <= 'f':
binary = fmt.Sprintf("%04b", ch-'a'+10)
}
reverseBinary := ""
for i := len(binary) - 1; i >= 0; i-- {
reverseBinary += string(binary[i])
}
return reverseBinary
}
// 将二进制字符串转换为十进制数
func binaryToDecimal(binary string) int {
decimal := 0
for i := 0; i < len(binary); i++ {
if binary[i] == '1' {
decimal += 1 << (len(binary) - 1 - i)
}
}
return decimal
}
// 将十进制数转换为十六进制字符
func decimalToHex(decimal int) string {
switch {
case decimal >= 0 && decimal <= 9:
return string(decimal + '0')
case decimal >= 10 && decimal <= 15:
return string(decimal - 10 + 'A')
}
return ""
}
