下面是一些关于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));
}
}