Java顺序表实现杨辉三角与洗牌

     顺序表的定义与方法并不难,直接了解其中方法也不能全都记住,所以直接利用例题更便于了解顺序表。

一、杨辉三角

杨辉三角大家都不陌生,现在我们用顺序表来实现杨辉三角。

思路:首先我们将杨辉三角写为数组的形式

1
11
121
1331
14641

就如上图为例,看图得知,每行的第一个数字与最后一个数字都为1,中间数字如第四行第二列的数字为上一行的本列与前一列相加的和,就是x=[i-1][j]+[i-1][j-1],大致逻辑已经理清,那么我们开始具体实现。

 根据我们的思路,需要运用二维数组,用顺序表的方式写就是List<List<Intager>>这样子,List<Intager>意为创建元素为Intager类型的列表,那么List<List<Intager>>就是创建元素为List<Intager>的列表,也就是我们的二维数组。

第一步,第一行的元素只有一个1,所以将1先添加到行列表,再将行列表添加到顺序表即完成了第一行杨辉三角:

List<List<Integer>> yangHui = new ArrayList<>();
        List<Integer> ret = new ArrayList<>();

        ret.add(1);
        yangHui.add(ret);

第二步,我们只要把每行的数据写好然后将行添加到顺序表就可以,而每行数据的第一个数据都为1,所以我们先添加1进入行列表。

第二个数据开始为中间数据,根据我们上面的逻辑得知我们需要或许前一行的数据,比如说我们在写第三行的数据时,第二行的数据已经编写好添加进了yanghui,所以我们只需要用yanghui(i-1)就可以调用前一行数据,用preRow接收后将j列与j-1列相加。因为每一行的最后一个数据都为1也不需要我们编写,所以列的循环范围应为不包含最后一列

for (int i = 1; i < num; i++) {
            //从第一行开始循环,因为第一行已经确定为1不用计算

            List<Integer> curRow = new ArrayList<>();
            //每次循环到新的一行,创建新的行对象

            curRow.add(1); //每行的第一个数据都为1

            //求中间的值
            for (int j = 1; j < i; j++) { //此循环为循环列,第一列都为1所以从第二列开始循环,小于i因为最后一列都为1
                List<Integer> preRow = yangHui.get(i-1);
                //创建preRow得到前一行列表

                int curNum = preRow.get(j) + preRow.get(j-1);
                //当前值为上一行的j列加j-1列

                curRow.add(curNum);
            }

第三步,则是添加每行的最后一个数据1,然后将本行添加进顺序表即可。

            curRow.add(1);
            yangHui.add(curRow);


        }

测试一下,调取前五行的杨辉三角:

二、洗牌

扑克牌属于抽象类对象,第一步首先应该抽象出牌的属性,也就是牌的花色与号码。

public class Card {
    
    String suit; //花色
    int num; //牌号

   public Card(String suit,int num){
       this.suit = suit;
       this.num = num;

   }

    @Override
    public String toString() { //重写tostring方法便于我们打印出牌
        return "Card{" +
                suit  +
                ", " + num +
                '}';
    }
}

想要洗牌的前提是有牌,所以第二步应该实例出52张牌放入顺序表中(除了大小王),

 public static List<Card> listCard = new ArrayList<>();
    public static String[] suits = {"♥","♣","♦","♠"};

    public static List<Card> cardSum(){
        for (int i = 0; i < 4; i++) {
            String suit = suits[i];
            for (int j = 1; j <14 ; j++) {
                Card card = new Card(suit,j);
                listCard.add(card);

            }
        }
        return listCard;

此时的listcard应该存了52张顺序的扑克牌。

洗牌的本质就是随机交换两张牌,所以第三步需要用到随机数功能,第三步将listcard中的牌随机交换:

 public static List<Card> washCard(List<Card> listCard){
        Random random = new Random();

        for (int i = listCard.size()-1; i > 0; i--) {
            int rand = random.nextInt(i);
            swap(listCard,i,rand);
            
        }
        return listCard;
    }

    public static  void swap(List<Card> listCard,int i ,int j){
        Card tmp = listCard.get(j);  //利用tmp接收随机卡片 然后进行交换
        listCard.set(j,listCard.get(i));
       listCard.set(i,tmp);
    }
}

洗完牌后可以模拟使用,假设三个人玩牌一人五张,那么需要实例三个人对象,然后将三个人添加进一个列表,组成二维数组,方便后面发牌:

        List<Card> person1 = new ArrayList<>();
        List<Card> person2 = new ArrayList<>();
        List<Card> person3 = new ArrayList<>();
        List<List<Card>> hand = new ArrayList<>();
        hand.add(person1);
        hand.add(person2);
        hand.add(person3);

然后使用顺序表的remove方法,返回出要删除的元素,随后顺序表前移,所以说我们一直删除0元素就可以获得不随机的六张牌:

 for (int i = 0; i <3 ; i++) {
            List<Card> cur = hand.get(i);
            for (int j = 0; j < 6 ; j++) {
                cur.add(list.remove(0));
            }

        }
        System.out.println(person1);
        System.out.println(person2);
        System.out.println(person3);

测试结果为:

总结来讲洗牌功能并不难,注意好细节,比如说swap方法不能直接使用int tmp接收随机数来完成交换,会造成牌重复等等。

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值