Java-数据结构-ArrayList-练习 ψ(*`ー´)ψ

​目录:

​一、练习一(删除str1中str2出现的元素):

    ▶ 思路:

▶ 代码: 

​二、练习二(杨辉三角):

▶ 思路: 

 ▶ 代码: 

​三、练习三(简单的洗牌算法):

▶ 思路和代码: 

总结:



一、练习一(删除str1中str2出现的元素):

    ▶ 思路:

我们先来看看这个题的条件是什么和如何去做:

 代码: 

我们来看代码是什么样的:

public static void main(String[] args) {
        //练习1
        String str1 = ("welcome to world");
        String str2 = ("come");
        ArrayList<Character> arrayList = new ArrayList<>();
        for (int i = 0; i < str1.length(); i++) {

            char ch = str1.charAt(i);
            if (!str2.contains(ch+"")) {//这里没有的话就放入顺序表中
                //这里的contains参数是CharSequence这个类型,我们ch为char,所以要将其变成字符串
                arrayList.add(ch);
            }
        }
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i) + "");
        }
        System.out.println("");
    }

我们来看看运行的结果是什么样的,和我们预期的所预期的有差别吗:

我们可以看到,这个代码是没有任何问题的。我们来看下一道题。


二、练习二(杨辉三角):

    杨辉三角,当然不是简单的杨辉三角了,我们来看:

  https://leetcode.cn/problems/pascals-triangle/icon-default.png?t=O83Ahttps://leetcode.cn/problems/pascals-triangle/

思路: 

在编写代码之前呢,我们先来看看这道题的一些分析和疑问:

  这个呢就是对于杨辉三角,如何做到的加值机制。

      在我们去看这道题的时候呢,我们会看到其返回值的时候,可能会有一些疑问,这个List<List<Integer>>  是什么意思,我们来进行解释一下:

  这样子呢,可能不是很理解,那么我们来看看代码是怎么实现的,来进一步理解一下:

  代码: 

Ok,基础的分析完了,我们来分析一下这个题怎么做: 我们来看代码:

public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();

        //先把第一行填入
        List<Integer> list0 = new ArrayList<>();
        list0.add(1);
        list.add(list0);

        //除了第一行的代码:
        for (int i = 1; i < numRows; i++) {//我们i不能从0开始,0行已经写完了,写下一行
            List<Integer> curList = new ArrayList<>();
            //处理每行的第一个元素
            curList.add(1);

            //处理中间元素
            List<Integer> preList = list.get(i - 1);//取list的上一行的一维数组元素
            for (int j = 1; j < i; j++) {
                //这里不能等于i,因为我们在下面处理最后一个元素
                int val1 = preList.get(j);
                int val2 = preList.get(j - 1);
                curList.add(val1 + val2);
            }

            //处理尾部的数据
            curList.add(1);
            //把处理过的顺序表放入list这个二维顺序表
            list.add(curList);
        }
        return list;
    }


三、练习三(简单的洗牌算法):

 思路和代码: 

 简单的洗牌算法:

   

我们来一步一步的进行写代码:

在写操作的代码之前,我们先把牌定义一下:

1、买牌操作:

2、洗牌操作:

3、发牌操作:

运行的结果:


 

▶ 总代码:

我们来看看合并起来的代码: 

牌的代码:

public class Card {
    public String suit;//花色
    public int rank;//牌的值

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

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

 对于牌的操作:

public class CardDemo {

    public static final String[] suits = {"♥","♠","♦","♣"};//不变的值

    //买牌:有序的
    public List<Card> buyCard() {
        List<Card> listcard = new ArrayList<>();

        //每个花色买13张牌
        for (int i = 1; i <= 13; i++) {
            for (int j = 0; j < 4; j++) {
                String suit = suits[j];
                int rank = i;
                Card card = new Card(suit,rank);

                listcard.add(card);
            }
        }
        return listcard;
    }

    //洗牌:
    private void swap(List<Card> cards,int i,int index) {
        /*
        我们这里想的交换元素是不是想要这么交换,不可以,
        因为我们cards里面是数组,而非cards是数组
        Card c = cards[i];
        cards[i] = cards[index];
        cards[index] = c;
         */
        //我们这样交换:
        Card c = cards.get(i);
        cards.set(i,cards.get(index));
        cards.set(index,c);
    }
    public void shuffle(List<Card> cards) {
        Random random = new Random();
        for (int i = cards.size() - 1; i > 0; i--) {
            int index = random.nextInt(i);
            //这里呢假如我们i是51,这里就生成0-50的随机数
            //进行交换元素
            swap(cards,i,index);
        }
    }

    //发牌:
    public List<List<Card>> play(List<Card> cards) {
        List<Card> hand0 = new ArrayList<>();
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();

        List<List<Card>> hand = new ArrayList<>();
        hand.add(hand0);
        hand.add(hand1);
        hand.add(hand2);

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card = cards.remove(0);

                hand.get(j).add(card);
            }
        }
        return hand;
    }
}

 主函数代码:

public static void main(String[] args) {
        CardDemo cardDemo = new CardDemo();
        //买牌:
        List<Card> cards = cardDemo.buyCard();
        System.out.println(cards);
        //洗牌:
        cardDemo.shuffle(cards);
        System.out.println(cards);
        //发牌:
        List<List<Card>> ret = cardDemo.play(cards);
        for (int i = 0; i < 3; i++) {
            System.out.println("第" + i +"个人的牌" + ret.get(i));
        }
    }

 总结:

       OK,我们这次关于顺序表的练习就到这里就结束了,我们接下来介绍为了解决顺序表ArrayList 的缺陷方面,而出现的链表的介绍。让我们期待下次的见面吧!!!拜拜~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值