文章目录
前言
这几天学习了顺序表,但是我有个问题,我学了这种结构有什么用呢?就到了我们今天的主角杨辉三角和简单的洗牌算法了。
一、杨辉三角
力扣链接: link
接下来我将讲解力扣中杨辉三角的实现。
1.关键点
1.认识题中List<List>为二维数组。
2.找到中间数字的规律为curRow[i][j]=preRow[i-1][j]+preRow[i-1][j-1]
3.列循环的终止条件为j<i
1.1示例代码
import java.util.ArrayList;
import java.util.List;
public class Solution {
public static List<List<Integer>> generate(int numRows) {
List list=new ArrayList();//一维数组的建立
List<List<Integer>> ret=new ArrayList();//二维数组的建立
list.add(1);//给第一行添加为1
ret.add(list);//添加到二维数组中
for(int i=1;i<numRows;i++){
//循环每走一次就是一行的创建
List<Integer> curRow=new ArrayList<>();
//添加首行元素
curRow.add(1);
//中间元素的添加
List<Integer> preRow=ret.get(i-1);//得到前一行
for(int j=1;j<i;j++){
curRow.add( preRow.get(j) + preRow.get(j - 1)) ;
}
//添加最后一行的元素
curRow.add(1);
ret.add(curRow);
}
return ret;
}
public static void main(String[] args) {
System.out.println(generate(5));
}
}
1.2运行截图
1.numRows=5时
2.numRows=1时
二、简单的洗牌算法
1.算法的实现思路
1.买牌
先创建一个card类实现牌的两种属性
1.num 牌的号码。
2.suit 牌的花色。
利用for循环初始化牌的数目为52张。
2.洗牌
怎样洗牌?
利用交换顺序的方式去洗牌,要利用到随机数的生成。
3.接牌
要利用到二维数组的建立,以及add,remove方法的使用。
2.具体的实现
2.1Card类
存放牌的基本属性以及重写toString方法和实现comparable接口,对接到手中的牌进行排序。
import java.util.List;
public class Card implements Comparable{
public int num;
public String suit;
public Card(int num, String suit) {
this.num = num;
this.suit = suit;
}
@Override
public int compareTo(Object o) {
Card card=(Card) o;
return Integer.compare(card.num, this.num);
}
@Override
public String toString() {
return String.format("[%s %d}",suit,num);
}
}
2.2CardGame类
各种操作的集合
2.2.1 buyDeck方法
初始化牌
public static final String[] SUITS={"♠","♥","♣","♦"};
//买牌
public static List<Card> buyDeck(){
List<Card> cardList=new ArrayList<>(52);
for (int i=0;i<4;i++){
for (int j = 1; j <=13 ; j++) {
/*String suit=SUITS[i];
int num=j;*/
Card card=new Card(j, SUITS[i]);
cardList.add(card);
}
}
return cardList;
}
2.2.2 shuffle方法
进行洗牌
public void shuffle(List<Card> cardList){
Random rand=new Random();
for (int i = cardList.size()-1; i >0 ; i--) {
int index=rand.nextInt(i);
swap(cardList,i,index);
}
}
public static void swap(List<Card> cardList,int i,int j){
Card tmp=cardList.get(i);
cardList.set(i,cardList.get(j));
cardList.set(j,tmp);
}
2.2.3getCard方法
接牌的操作方法
public List<List<Card>> getCard(List<Card> cardList){
List<Card> hand1=new ArrayList<>();
List<Card> hand2=new ArrayList<>();
List<Card> hand3=new ArrayList<>();
List<List<Card>> hand=new ArrayList<>();
hand.add(hand1);
hand.add(hand2);
hand.add(hand3);
for (int i = 0; i <5; i++) {
for (int j = 0; j < 3; j++) {
Card card=cardList.remove(0);//模拟从最上面一张牌接走的操作
hand.get(j).add(card);
}
}
return hand;
}
2.3 Test类
运行测试的类
package demo;
import java.util.*;
public class Test {
public static void main(String[] args) {
CardGame cardgame=new CardGame();
List<Card> ret =cardgame.buyDeck();
System.out.println("买牌: ");
System.out.println(ret);
System.out.println("洗牌: ");
cardgame.shuffle(ret);
System.out.println(ret);
List<List<Card>> hand=cardgame.getCard(ret);
System.out.println("接牌: ");
for (int i = 0; i < hand.size(); i++) {
Collections.sort(hand.get(i));
System.out.println("第"+(i+1)+"个人的牌为:"+(hand.get(i)));
}
System.out.println("剩下的牌为");
System.out.println(ret);
}
}
2.4 运行结果
总结
今天我的分享就到此结束了,通过对这些代码的练习我觉得我对Java中的面向对象的思想有了更深的理解,同时也感谢博哥以及其他很多人的帮助,愿我们在编程这条路上越走深,感谢大家的浏览。