ArrayList与顺序表(二)(相关习题)

45 篇文章 0 订阅

我们用实际的用例解释一下ArrayList的具体使用。

1.简单的洗牌算法

有一副扑克牌,除去大小王,有52张,要求我们打乱所有牌的顺序,分发给3个人,并让他们展示手中的牌(不要求排序)。

1.1牌

/**
 * Describe:一张牌的相关信息
 * User:lenovo
 * Date:2022-12-30
 * Time:13:11
 */
public class Card {
    private int rank;//牌的面值
    private String suit;//牌的花色

    //构造方法
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public Card() {}

    //设置成员变量的方法

    public void set(int rank) {
        this.rank = rank;
    }
    public void set(String suit) {
        this.suit = suit;
    }
    public void set(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    //toString()
    public String toString() {
        return String.format("[%d,%s]",rank,suit);
    }
}

第一步我们先创建牌,成员变量包含:牌的面值、牌的花色。下面的成员方法,我们可以在使用到的时候在进行创建。这里我直接把可能会用到的方法直接写出(一些方法可能没用到,但是问题不大)。

1.2创建一副牌

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Describe:一副牌的相关信息,不包含大小王,有洗牌的方法
 * User:lenovo
 * Date:2022-12-30
 * Time:13:18
 */
public class CardDemo {
    private static final String[] SUITS = {"♥", "♠", "♦", "♣"};
    private List<Card> cardDemo = new ArrayList<>(52);

    //构造方法
    public CardDemo() {
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j < 13; j++) {
                String suit = SUITS[i];
                int rank = j;
                Card card = new Card(rank, suit);
                cardDemo.add(card);
            }
        }
    }

    //洗牌操作
    public void shuffle() {
        Random random = new Random(this.cardDemo.size());
        for (int i = 0; i < this.cardDemo.size(); i++) {
            int j = random.nextInt(this.cardDemo.size());
            swap(this.cardDemo, i, j);
        }
    }
    /**
     * 交换指定牌的位置
     */
    private void swap(List<Card> cardDemo, int i, int j) {
        Card card1 = cardDemo.get(i);
        Card card2 = cardDemo.get(j);
        Card tmp = card1;
        cardDemo.set(i, card2);
        cardDemo.set(j, tmp);
    }

    //获取数组
    public List<Card> getCardDemo() {
        return cardDemo;
    }
}

一副牌包含52张(去掉大小王),成员变量包含:52张牌,成员方法包含:构造方法(并将牌进行初始化),洗牌方法,成员变量的获取方法。

1.3进行测试

import java.util.ArrayList;
import java.util.List;

/**
 * Describe:
 * User:lenovo
 * Date:2022-12-30
 * Time:17:14
 */
public class Test {
    public static void main(String[] args) {
        CardDemo deck = new CardDemo();
        //进行洗牌操作
        deck.shuffle();
        //进行分牌
        List<List<Card>> players = new ArrayList<>();
        players.add(new ArrayList<>());
        players.add(new ArrayList<>());
        players.add(new ArrayList<>());
        //开始分牌,一个人5张
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < players.size(); j++) {
                players.get(j).add(deck.getCardDemo().remove(0));
            }
        }
        System.out.println(players.get(0).toString());
        System.out.println(players.get(1).toString());
        System.out.println(players.get(2).toString());
    }
}

我们创建一副牌,并进行洗牌操作,把这些牌分给3个人,每人5张。这里使用数组的remove()方法进行分牌,这会造成一副牌(对象)的数量逐渐减少。

1.4结果展示

 2.杨辉三角

利用顺序表的思想,输出杨辉三角的前N行。

import java.util.ArrayList;
import java.util.List;

/**
 * Describe:求出杨辉三角的前N行
 * User:lenovo
 * Date:2022-12-30
 * Time:19:16
 */
public class Test {
    public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> array = new ArrayList<>(numRows);
        //要填充的前一行
        List<Integer> lastArray1 = new ArrayList<>();
        for (int i = 0; i < numRows; i++) {
            //要填充的一行
            List<Integer> array1 = new ArrayList<>();
            //第一个元素
            array1.add(1);
            //第2个到i-1个元素
            for (int j = 1; j < i; j++) {
                lastArray1 = array.get(i - 1);
                array1.add(lastArray1.get(j - 1) + lastArray1.get(j));
            }
            //最后一个元素
            if(i != 0) {
                array1.add(1);
            }
            array.add(array1);
        }
        return array;

    }

    public static void main(String[] args) {
        int n = 6;
        List<List<Integer>> array = generate(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < array.get(i).size(); j++) {
                System.out.print(array.get(i).get(j) + " ");
            }
            System.out.println();
        }

    }
}

 我们要根据杨辉三角的规律来进行解题,第array[i][j] = array[i -1][j - 1] + array[i - 1][j];第一个元素和最后一个元素都是1,即可解出此题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值