跳到正文
源码达人

【算法】格式化字符串

算法 柠檬鱼

需求

给定一个混合数字和字母的字符串,尝试编写程序对字符串进行格式化,使得新的字符串满足如下条件:

  • 相同类型的字母不能相连,即数字的左右必须是字母,字母的左右必须是数字。
  • 如果无法满足上述条件,则返回空字符串。

思路

根据需求,字符被分为数字型和字母型这两类,那么第一步就需要对字符进行分类。 分类完成后需要重新组合,如果这两类字符的数量大于1,则不能满足条件,返回空字符串。满足条件则取出字符重新排列成新的字符串。 需要注意的是:首个字符需要从数量较多的一类取出。

实现:

package chapter01

import (
	"math"
	"strings"
)

func reformat(s string) (res string) {
	numStr := "0123456789"

	var numList, charList []string

	for _, v := range s {
		str := string(v)
		if strings.Contains(numStr, string(v)) {
			numList = append(numList, str)
		} else {
			charList = append(charList, str)
		}
	}
	if math.Abs(float64(len(numList)-len(charList))) > 1 {
		return
	}
	if len(numList) > len(charList) {
		for i := 0; i < len(charList); i++ {
			res += numList[i]
			res += charList[i]
		}
		res += numList[len(charList)]
	} else if len(numList) == len(charList) {
		for i := 0; i < len(charList); i++ {
			res += numList[i]
			res += charList[i]
		}
	} else {
		for i := 0; i < len(numList); i++ {
			res += charList[i]
			res += numList[i]
		}
		res += charList[len(numList)]
	}
	return res
}