【Java数据结构】ArrayList相关的算法

下面是一些关于ArrayList(顺序表)相关的题目:

第一题:算法题

复制代码
    public static List<Character> fun(String str1, String str2) {
        List<Character> list = new ArrayList<>();
        for (int i = 0; i < str1.length(); i++){
            char ch = str1.charAt(i);
            if (!str2.contains(ch+""))
            list.add(ch);
        }
        return list;
    }

这个算法是这样实现的,首先先将str1中的首字符取出来,然后将首字符在str2中寻找,如果没有就将这个字符添加到新创建的list中;然后一个一个取出来进行比较,找出str2中不存在的存进去即可。

如果不用ArrayList,那么这个算法的复杂度就会增加,我们现在是巧妙地运用了contains这个方法就可以不用两层循环解决。

第二题:杨辉三角

复制代码
    public static List<List<Integer>> fun(int n){
        List<List<Integer>> list =  new ArrayList<>();
        List<Integer> ret = new ArrayList<>();
        ret.add(1);
        list.add(ret);
        for (int i = 1; i < n; i++){
            List<Integer> cur = new ArrayList<>();
            cur.add(1);
            List<Integer> pre = list.get(i-1);
            for (int j = 1; j < i; j++){
                cur.add(pre.get(j)+pre.get(j-1));
            }
            cur.add(1);
            list.add(cur);
        }
        return list;
    }

这个原理就是把这个"二维数组"看作一个二维的链表(List<List<Integer>>),首先先把第一层的添加进去,然后通过for循环将其他的n-1层添加进去就构成了这个图中的杨辉三角。其重点还是在for循环里,首先某一层的的第一个都是1,在for里面创建一个变量,把1加进去,然后再通过循环将对应上一层的一个和前一个相加(得到j位置的数和j-1位置的数相加),这一层最后一个数也是1,所以都放在第一个循环里,最后返回这个链表就可以结束了。

第三题 :简单的洗牌算法

大致流程就是:牌、一副牌、打乱、发牌

首先需要有牌,一张牌中有数组和花色;

复制代码
public class Card {
    public String degin;//花色
    public int digit;//数字

    public String toString(){
        return "["+degin+","+digit+"]";
    }
}

然后再创建一副牌,包含四种花色,每种花色分别有13张牌(除去大小王);这里为什么用静态方法,就是这副牌是实现就创造好的,往后再使用这副牌就不需要再创造一副。

复制代码
public class CardPile {
    private static String[] suit = {"♠","♥","♣","♦"};
    //创造一副牌
    private static List<Card> buyCard(){
        List<Card> list = new ArrayList<>();
        for(int i = 0; i < suit.length; i++){
            for (int j =1; j <= 13; j++){
                String degin = suit[i];
                int digit = j;
                Card card = new Card();
                card.degin = degin;
                card.digit = digit;
                list.add(card);
            }
        }
        return list;
    }

其次就是将这副牌打乱,如何打乱?将第一张牌与随机一张牌交换,就可以打乱其所有牌;

复制代码
    public List<Card> disturbCard(List<Card> list){
        Random r = new Random();
        for (int i = 0; i < list.size() - 1; i++){
            int ret = r.nextInt(list.size());
            swap(list, i, ret);
        }
        return list;
    }

最后就是发牌,每次一张三个人一个回合直至牌发完(没人平均17张,剩一张);重点就是这三个玩家又构成一个链表,然后通过两层循环外层每个玩家的牌数,内层玩家个数。

复制代码
    public static void main(String[] args) {
        List<Card> card = buyCard();
        System.out.println(card);
        disturbCard(card);
        System.out.println(card);
        //将这堆牌发给三个人
//        List<Card> hand1 = new ArrayList<>();
//        List<Card> hand2 = new ArrayList<>();
//        List<Card> hand3 = new ArrayList<>();
        //不能以上的方法创建三个人,不然不好发牌
        List<List<Card>> hands = new ArrayList<>();
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());

        for (int i = 0; i < 17; i++){
            for (int j = 0; j <3; j++){
                //统一将第一张牌安顺序发给三位玩家,相当于删除这堆牌的第一张
                hands.get(j).add(card.remove(0));
            }
        }
        System.out.println("剩下的一张牌");
        System.out.println(card);
        System.out.println("第一位玩家的牌");
        System.out.println(hands.get(0));
        System.out.println("第二位玩家的牌");
        System.out.println(hands.get(1));
        System.out.println("第三位玩家的牌");
        System.out.println(hands.get(2));
    }
}
相关推荐
土豆.exe1 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
xixiaoyunya2 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的2 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务2 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
kunicoding2 小时前
多线程编程核心概念详解:从线程基础到并发安全
java·jvm·安全
snow@li3 小时前
SpringBoot:核心注解全景梳理 / @xxx 叫“注解”(Annotation)
java·spring
devilnumber3 小时前
避坑_IDEA 提取方法(Extract Method)工具
java·ide·intellij-idea
鬼手点金3 小时前
Agent 的学习机制:后训练、上下文学习与外部化学习
java·人工智能·git·学习·自动化·nanogpt
小陈不好吃3 小时前
equals 与 hashCode 的契约关系:从 HashMap 到 Lombok 注解
java·hashmap·lombok
xiaogai_gai4 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库