前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-07-21:一张扑克有3个属性,每种属性有3种值(A、B、C),比如"AAA",第一个属性值A,第二个属性值A,第三个

2021-07-21:一张扑克有3个属性,每种属性有3种值(A、B、C),比如"AAA",第一个属性值A,第二个属性值A,第三个

作者头像
福大大架构师每日一题
发布2021-08-05 16:29:04
5470
发布2021-08-05 16:29:04
举报

2021-07-21:一张扑克有3个属性,每种属性有3种值(A、B、C),比如"AAA",第一个属性值A,第二个属性值A,第三个属性值A,比如"BCA",第一个属性值B,第二个属性值C,第三个属性值A。给定一个字符串类型的数组cards[],每一个字符串代表一张扑克,从中挑选三张扑克,一个属性达标的条件是:这个属性在三张扑克中全一样,或全不一样,挑选的三张扑克达标的要求是:每种属性都满足上面的条件。比如:"ABC"、"CBC"、"BBC",第一张第一个属性为"A"、第二张第一个属性为"C"、第三张第一个属性为"B",全不一样;第一张第二个属性为"B"、第二张第二个属性为"B"、第三张第二个属性为"B",全一样;第一张第三个属性为"C"、第二张第三个属性为"C"、第三张第三个属性为"C",全一样;每种属性都满足在三张扑克中全一样,或全不一样,所以这三张扑克达标。返回在cards[]中任意挑选三张扑克,达标的方法数。

福大大 答案2021-07-26:

时间紧。思路见代码。

代码用golang编写。代码如下:

代码语言:javascript
复制
import (
    "container/list"
    "fmt"
)

func main() {
    cards := []string{"ABC", "AAC", "ACC"}
    ret := ways2(cards)
    fmt.Println(ret)

}

func ways2(cards []string) int {
    counts := make([]int, 27)
    for _, s := range cards {
        counts[(s[0]-'A')*9+(s[1]-'A')*3+(s[2]-'A')*1]++
    }
    ways := 0
    for status := 0; status < 27; status++ {
        n := counts[status]
        if n > 2 {
            ways += twoSelectOne(n == 3, 1, n*(n-1)*(n-2)/6)
        }
    }
    path2 := list.New().Init()
    for i := 0; i < 27; i++ {
        if counts[i] != 0 {
            path2.PushBack(i)
            ways += process2(counts, i, path2)
            path2.Remove(path2.Back())
        }
    }
    return ways
}

func twoSelectOne(c bool, a int, b int) int {
    if c {
        return a
    } else {
        return b
    }
}

// 之前的牌面,拿了一些    ABC  BBB  ...
// pre = BBB
// ABC  ...
// pre  = ABC
// ABC BBB CAB
// pre = CAB
// 牌面一定要依次变大,所有形成的有效牌面,把方法数返回
func process2(counts []int, pre int, path2 *list.List) int {
    if path2.Len() == 3 {
        return getWays2(counts, path2)
    }
    ways := 0
    for next := pre + 1; next < 27; next++ {
        if counts[next] != 0 {
            path2.PushBack(next)
            ways += process2(counts, next, path2)
            path2.Remove(path2.Back())
        }
    }
    return ways
}

func getWays2(counts []int, path2 *list.List) int {
    v1 := path2.Front().Value.(int)
    v2 := path2.Front().Next().Value.(int)
    v3 := path2.Front().Next().Next().Value.(int)
    for i := 9; i > 0; i /= 3 {
        cur1 := v1 / i
        cur2 := v2 / i
        cur3 := v3 / i
        v1 %= i
        v2 %= i
        v3 %= i
        if (cur1 != cur2 && cur1 != cur3 && cur2 != cur3) || (cur1 == cur2 && cur1 == cur3) {
            continue
        }
        return 0
    }
    v1 = path2.Front().Value.(int)
    v2 = path2.Front().Next().Value.(int)
    v3 = path2.Front().Next().Next().Value.(int)
    return counts[v1] * counts[v2] * counts[v3]
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class19/Code05_CardsProblem.java)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档