需求

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

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

思路

根据需求,字符被分为数字型字母型这两类,那么第一步就需要对字符进行分类。 分类完成后需要重新组合,如果这两类字符的数量大于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
}