当前位置: 首页 > article >正文

华为机考练习(golang)

 
 题目描述 在斗地主只扑克牌游戏中,扑克牌由小到大的顺序为:3.4,5.6,7.8,9,10.J,Q.K.A.2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为:由至少5张由小到大连续递增的 扑克牌只 组成,且不能包含2。 
 例如:(3.4,5,6,7}、(3.4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{,Q,K,A,2}、(2,3,4,5,6}、(3,4,5,6}、(3,4,5.6,8)等都不是顺子给定一个包含 13 张牌的数组,如果有满足出牌规则的顺子,请输出顺子。 如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。 如果没有满足出牌规则的顺子,请输出NO。输入描述: 13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:2 9 J 2 3 4 K A 7 9  A 5 6不需要考虑输入为异常字符的情况输出描述: 组成的顺子,每张扑克牌数字用空格隔开:3 4 5 6 7 
 示例1 
 输入 
 2 9 J 2 3 4 K A 7 9 A 5 6 
 输出 
 3 4 5 6 7 <
 

package main

import (
	"errors"
	"fmt"
	"log"
	"sort"
	"strings"
)

func getIndex(list []string, value string) (int, error) {
	for i, s := range list {
		if s == value {
			return i, nil
		}
	}
	return 0, errors.New("元素不存在")
}

func removeSliceElements(list []int, removeIndex []int) (subList []int) {

	for i, v := range list {
		isNeedRemove := false
		for _, indexValue := range removeIndex {
			if i == indexValue {
				isNeedRemove = true
			}
		}
		if !isNeedRemove {
			subList = append(subList, v)
		}
	}
	return
}

// 获取数组里的一个顺子
func getContinuePoker(list []int) (subList []int, continuePoker []int) {
	if len(list) < 5 {
		return list, make([]int, 0)
	}

	continuePokerIndexList := make([]int, 0)
	continuePokerTemp := make([]int, 0)
	for i, v := range list {
		if i == 0 {
			continuePokerTemp = append(continuePokerTemp, v)
			continuePokerIndexList = append(continuePokerIndexList, i)
			continue
		}

		subValue := v - list[i-1]
		if subValue == 0 {
			//出现重复数字
			continue
		} else if subValue == 1 {
			//连续
			continuePokerTemp = append(continuePokerTemp, v)
			continuePokerIndexList = append(continuePokerIndexList, i)
		} else {
			//不连续
			break

		}
	}

	continuePoker = continuePokerTemp
	//删除输入切list中对应的顺子的元素
	subList = removeSliceElements(list, continuePokerIndexList)

	return subList, continuePoker

}

// 获取数组里的全部顺子
func getContinuePokers(list []int, continuePokers [][]int) [][]int {
	if subList, continuePoker := getContinuePoker(list); len(subList) >= 5 {
		if len(continuePoker) >= 5 {
			continuePokers = append(continuePokers, continuePoker)
		}
		return getContinuePokers(subList, continuePokers)
	} else {
		return continuePokers
	}

}

func printPokers(continueList [][]int, templateIndex []string) {
	if len(continueList) == 0 {
		log.Println("NO")
	} else {
		for _, s := range continueList {
			tempString := ""
			for _, i := range s {
				if tempString == "" {
					tempString = fmt.Sprintf("%s", templateIndex[i])
				} else {
					tempString = fmt.Sprintf("%s %s", tempString, templateIndex[i])
				}
			}

			log.Println(tempString)
		}
	}
}

func main() {
	templateIndex := []string{"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"}

	inputStr := "2 3 4 5 6 7 10 J Q K A 2 3 4 5 6 7 10 J Q K A 10 J Q K A 2 3 4 5 6 7 7 10 J Q K A 10 J Q 8 8 8 9 9"
	inputStrList := strings.Split(inputStr, " ")

	inputIndexList := make([]int, 0)
	for _, item := range inputStrList {
		if item == "" {
			continue
		}
		//排除掉“2”
		if item == "2" {
			log.Println("去除掉元素‘2’ ")
			continue
		}
		if itemIndex, err := getIndex(templateIndex, item); err != nil {
			log.Println(fmt.Sprintf("输入的:%d 不符合规则", itemIndex))
			continue
		} else {
			inputIndexList = append(inputIndexList, itemIndex)
		}
	}

	if len(inputIndexList) == 0 {
		return
	} else {
		//按照纸牌大小重新牌型
		sort.Ints(inputIndexList)
		//查找顺子牌
		continueList := make([][]int, 0)
		continueList = getContinuePokers(inputIndexList, continueList)
		printPokers(continueList, templateIndex)
	}

}


http://www.kler.cn/a/320772.html

相关文章:

  • 场景营销在企业定制开发 AI 智能名片 S2B2C 商城小程序中的应用与价值
  • 大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java
  • 从零开始学习 sg200x 多核开发之 eth0 MAC 地址修改
  • Vue3 provide 和 inject的使用
  • mindspore发布件
  • Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)
  • 算法.图论-并查集
  • C++:string类写时拷贝|引用计数
  • git使用方法详解(适合新手)
  • 找免费正版高清图片,就上这8个网站。
  • 深度拆解:如何在Facebook上做跨境电商?
  • 【docker】debian中配置docker(2024年9月)
  • YOLOv8-pose+streamlit 实现人体关键点检测/姿态估计系统(后续可用于健身时的姿态估计,训练纠正等....)
  • 智算中心动环监控:构建高效、安全的数字基础设施@卓振思众
  • 从Unity到Godot
  • Ubuntu22.04安装paddle
  • 超越sora,最新文生视频CogVideoX-5b模型分享
  • 4.SPI外设—LCD小案例
  • 拓数派荣获上海数据交易所“数据治理服务商”认证
  • 无线领夹麦克风哪个牌子好,2024年新款领夹麦克风推荐
  • 回归预测 | Matlab基于SO-SVR蛇群算法优化支持向量机的数据多输入单输出回归预测
  • 【监控体系搭建一】Docker安装与使用
  • 万界星空科技铜拉丝行业MES系统,实现智能化转型
  • Prometheus使用Pushgateway推送数据
  • 【数据结构】栈和队列(Stack Queue)
  • 统信服务器操作系统ade版【iostat】命令详解