题解 | #字符串合并处理#

字符串合并处理

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)
}

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务