一、练习一(删除str1中str2出现的元素):
▶ 思路:
我们先来看看这个题的条件是什么和如何去做:
▶ 代码:
我们来看代码是什么样的:
public static void main(String[] args) { //练习1 String str1 = ("welcome to world"); String str2 = ("come"); ArrayList<Character> arrayList = new ArrayList<>(); for (int i = 0; i < str1.length(); i++) { char ch = str1.charAt(i); if (!str2.contains(ch+"")) {//这里没有的话就放入顺序表中 //这里的contains参数是CharSequence这个类型,我们ch为char,所以要将其变成字符串 arrayList.add(ch); } } for (int i = 0; i < arrayList.size(); i++) { System.out.print(arrayList.get(i) + ""); } System.out.println(""); }
我们来看看运行的结果是什么样的,和我们预期的所预期的有差别吗:
我们可以看到,这个代码是没有任何问题的。我们来看下一道题。
二、练习二(杨辉三角):
杨辉三角,当然不是简单的杨辉三角了,我们来看:
https://leetcode.cn/problems/pascals-triangle/
https://leetcode.cn/problems/pascals-triangle/
▶ 思路:
在编写代码之前呢,我们先来看看这道题的一些分析和疑问:
这个呢就是对于杨辉三角,如何做到的加值机制。
在我们去看这道题的时候呢,我们会看到其返回值的时候,可能会有一些疑问,这个List<List<Integer>> 是什么意思,我们来进行解释一下:
这样子呢,可能不是很理解,那么我们来看看代码是怎么实现的,来进一步理解一下:
▶ 代码:
Ok,基础的分析完了,我们来分析一下这个题怎么做:
我们来看代码:
public static List<List<Integer>> generate(int numRows) { List<List<Integer>> list = new ArrayList<>(); //先把第一行填入 List<Integer> list0 = new ArrayList<>(); list0.add(1); list.add(list0); //除了第一行的代码: for (int i = 1; i < numRows; i++) {//我们i不能从0开始,0行已经写完了,写下一行 List<Integer> curList = new ArrayList<>(); //处理每行的第一个元素 curList.add(1); //处理中间元素 List<Integer> preList = list.get(i - 1);//取list的上一行的一维数组元素 for (int j = 1; j < i; j++) { //这里不能等于i,因为我们在下面处理最后一个元素 int val1 = preList.get(j); int val2 = preList.get(j - 1); curList.add(val1 + val2); } //处理尾部的数据 curList.add(1); //把处理过的顺序表放入list这个二维顺序表 list.add(curList); } return list; }
三、练习三(简单的洗牌算法):
▶ 思路和代码:
简单的洗牌算法:
我们来一步一步的进行写代码:
在写操作的代码之前,我们先把牌定义一下:
1、买牌操作:
2、洗牌操作:
3、发牌操作:
运行的结果:
▶ 总代码:
我们来看看合并起来的代码:
牌的代码:
public class Card {
public String suit;//花色
public int rank;//牌的值
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return String.format("[%s %d]",suit,rank);
}
}
对于牌的操作:
public class CardDemo {
public static final String[] suits = {"♥","♠","♦","♣"};//不变的值
//买牌:有序的
public List<Card> buyCard() {
List<Card> listcard = new ArrayList<>();
//每个花色买13张牌
for (int i = 1; i <= 13; i++) {
for (int j = 0; j < 4; j++) {
String suit = suits[j];
int rank = i;
Card card = new Card(suit,rank);
listcard.add(card);
}
}
return listcard;
}
//洗牌:
private void swap(List<Card> cards,int i,int index) {
/*
我们这里想的交换元素是不是想要这么交换,不可以,
因为我们cards里面是数组,而非cards是数组
Card c = cards[i];
cards[i] = cards[index];
cards[index] = c;
*/
//我们这样交换:
Card c = cards.get(i);
cards.set(i,cards.get(index));
cards.set(index,c);
}
public void shuffle(List<Card> cards) {
Random random = new Random();
for (int i = cards.size() - 1; i > 0; i--) {
int index = random.nextInt(i);
//这里呢假如我们i是51,这里就生成0-50的随机数
//进行交换元素
swap(cards,i,index);
}
}
//发牌:
public List<List<Card>> play(List<Card> cards) {
List<Card> hand0 = new ArrayList<>();
List<Card> hand1 = new ArrayList<>();
List<Card> hand2 = new ArrayList<>();
List<List<Card>> hand = new ArrayList<>();
hand.add(hand0);
hand.add(hand1);
hand.add(hand2);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Card card = cards.remove(0);
hand.get(j).add(card);
}
}
return hand;
}
}
主函数代码:
public static void main(String[] args) {
CardDemo cardDemo = new CardDemo();
//买牌:
List<Card> cards = cardDemo.buyCard();
System.out.println(cards);
//洗牌:
cardDemo.shuffle(cards);
System.out.println(cards);
//发牌:
List<List<Card>> ret = cardDemo.play(cards);
for (int i = 0; i < 3; i++) {
System.out.println("第" + i +"个人的牌" + ret.get(i));
}
}
总结:
OK,我们这次关于顺序表的练习就到这里就结束了,我们接下来介绍为了解决顺序表ArrayList 的缺陷方面,而出现的链表的介绍。让我们期待下次的见面吧!!!拜拜~~~