题解 | #字符串合并处理#
字符串合并处理
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 "" }