顺序表的定义与方法并不难,直接了解其中方法也不能全都记住,所以直接利用例题更便于了解顺序表。
一、杨辉三角
杨辉三角大家都不陌生,现在我们用顺序表来实现杨辉三角。
思路:首先我们将杨辉三角写为数组的形式
1 | ||||
1 | 1 | |||
1 | 2 | 1 | ||
1 | 3 | 3 | 1 | |
1 | 4 | 6 | 4 | 1 |
就如上图为例,看图得知,每行的第一个数字与最后一个数字都为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接收随机数来完成交换,会造成牌重复等等。