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