本节目标:
1.简单的洗牌算法
2.杨辉三角形例题
3.消除字符串中特定字母问题
一.简单的洗牌算法
一开始先列一下我们的需求。洗牌算法需要先有牌,第二步进行洗牌,第三步发牌,并且将剩余牌打印,第四步可以让牌排个序
第一步.生成牌
众所周知,牌是由4个图标组成,分别为"♠", "♥", "♣", "♦"
还有13个数字组成,A,2,3,4,5,6,7,8,9,10,J、Q、K
我们把它们都算为1-13的数字
先生成牌这个类
测试我们的生成牌方法
第二步.洗牌
思路:洗牌的逻辑就是交换,遍历一遍该顺序表,用随机数与之交换从而实现洗牌的目的
测试结果
可见确实实现了打乱牌的步骤
第三步.发牌
三个人,每人随机拿五张牌,逻辑为每个人都抽取第一张牌,满足了随机抽牌的要求,比较洗过的牌本身就满足随机。
测试
明显能发现。发完牌后,总牌数减少了
可见是成功的
第四步.排序
排序用到的是Comparator(比较器)来进行比较
定义一个比较的方法
在顺序表内部有一个Collections接口,有内置的比较方法
Collections.sort有函数的重载,除了可以直接放顺序表以外,也可以在后面放一个自定义比较器类型
比如这里我写了一个比较器类
比较的是卡牌的数字,通过数字大小进行排序
再拿到主函数内部进行测试
测试后的结果证明了我的方法是可以的
简单的洗牌算法完毕。
此处,我将所有的代码放过来
第五步.总代码
Card.java
java">public class Card {
public String suit;
public int rank;
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
public String getSuit() {
return suit;
}
public void setSuit(String suit) {
this.suit = suit;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
@Override
public String toString() {
return "{"+suit+" "+rank+"}";
}
}
Cards.java
java">import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Random;
public class Cards{
public final String suits[]={"♠", "♥", "♣", "♦"};
public ArrayList<Card> buyCards(){//洗牌前应该先出创建52张扑克牌
ArrayList<Card> arrayList=new ArrayList<>();//用顺序表存储这一张张的牌,数据类型为Card类类型
for(int i=0;i<suits.length;i++){
for(int j=1;j<=13;j++){
Card card=new Card(suits[i],j);
arrayList.add(card);//arrayList.add插入牌
}
}
return arrayList;//返回个顺序表
}
public void Shuffle(ArrayList<Card> arrayList){//洗牌的方法
Random random=new Random();
for(int i=arrayList.size()-1;i>0;i--){
int ret =random.nextInt(i);
swap(arrayList,i,ret);//交换
}
}
private void swap(ArrayList<Card> arrayList,int pos,int ret){
Card card=arrayList.get(pos);//临时变量存储pos
arrayList.set(pos,arrayList.get(ret));//将ret位置的给pos位置
arrayList.set(ret,card);
}
public void drawCard(ArrayList<Card> arrayList){//牌的分发
ArrayList<Card> arrayList1=new ArrayList<>();//三个空顺序表
ArrayList<Card> arrayList2=new ArrayList<>();
ArrayList<Card> arrayList3=new ArrayList<>();;
ArrayList<ArrayList<Card>> list =new ArrayList<>();//一个二维数组
list.add(arrayList1);
list.add(arrayList2);
list.add(arrayList3);
for(int i=0;i<5;i++){
for(int j=0;j<list.size();j++){
Card card=arrayList.remove(0);
list.get(j).add(card);
}
}
System.out.println("第一个人得到的牌为:"+arrayList1);
System.out.println("第二个人得到的牌为:"+arrayList2);
System.out.println("第三个人得到的牌为:"+arrayList3);
}
public void sortCard(ArrayList<Card> arrayList){//牌的排序
RankComparator rankComparator=new RankComparator();
Collections.sort(arrayList,rankComparator);//Collection的比较方法,比较内部数字的大小
}
}
RankComparator.java
java">import java.util.Comparator;
public class RankComparator implements Comparator<Card> {//Comparator后面的泛型写要比较的类型,这里需要比较的是Card类型
@Override
public int compare(Card o1, Card o2) {//使用比较器,进行比较,传入两个Card类
return o1.getRank()-o2.getRank();//前者减去后者是正序排序,后者减去前者是逆序排序
//使用card.getRank可以获取需要比较的数字 ,需要在Card里面自己定义get方法
}
}
test.java
java">import java.util.ArrayList;
public class test {
public static void main(String[] args) {
Cards Cards=new Cards();
ArrayList<Card> list=Cards.buyCards();
System.out.println("交换后的牌为:");
System.out.println(list);
Cards.drawCard(list);
System.out.println("剩余的牌为:");
System.out.println(list);
System.out.print("比较后的卡牌为:");
Cards.sortCard(list);
System.out.println(list);
}
}
二.杨辉三角形例题
118. 杨辉三角 - 力扣(LeetCode)
这是例题链接
思路:第一行固定是1,除了第一行。第一个数字和最后一个数字也都是1
中间的数字存在的规律,假设求a[i][j]的数是什么
a[i][j]=a[i-1][j-1]+a[i-1]+[j];
用二维数组来表示即可
代码:
java">class Solution {
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret=new ArrayList();
List<Integer> list=new ArrayList();
list.add(1);
ret.add(list);
for(int i=1;i<numRows;i++){
List<Integer> temp=new ArrayList();
temp.add(1);
for(int j=1;j<i;j++){
temp.add(ret.get(i-1).get(j-1)+ret.get(i-1).get(j));
}
temp.add(1);
ret.add(temp);
}
return ret;
}
}
三.消除字符串中特定字母问题
给你两个字符串
str1="welcome to bit"
str2="come"
要求:删除str1中的所有包含str2的字母
例题:上面的结果为"wl t bit"
解法一:
空间复杂度为O(n²)
效率特别低
两个字符串存进两个数组里,再一个一个比较,相同的就前移
解法二:
创建数组,使用字符串contains方法,虽然要求的是字符串,我们可以ch+""方法来转变为字符串
如果不同就放进数组
解法三:
字符串拼接的方法,使用StringBuilder