【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

这篇具有很好参考价值的文章主要介绍了【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

✨个人主页:bit me
✨当前专栏:数据结构
✨每日一语:不要等到了你的人生垂暮,才想起俯拾朝花,且行且珍惜。
【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

🌵 一. 杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌
示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

思路:我们可以把杨辉三角更加抽象化为我们所用
【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌
在这里我们可以看出来它就是类似于一个二维数组,我们从上面的动态图当中也可以知道它所组成的规律

在杨辉三角中,除了每一行第一个和最后一个元素都是固定为元素1之外,其余的元素都是由上一行的同列元素和上一行同列元素的前一个元素之和组成的

所以在这里我们可以试着用i和j来分别表示行和列,用二维数组来表示就是[i][j] = [i-1][j] + [i-1][j-1]

  1. 先定义一个二维数组ret
List<List<Integer>> ret = new ArrayList<>();//二维数组
  1. 第0行的元素不参与规律计算,我们直接给第0行赋值为1
List<Integer> one = new ArrayList<>();
one.add(1);
ret.add(one);
  1. 定义行数为i,遍历行数
for (int i = 1; i < numRows; i++) {
	...
}

①:数组的每一行第一个元素都是固定的为1,把遍历到的数组都定义为curRow,然后赋值第一个元素1

List<Integer> curRow = new ArrayList<>();
curRow.add(1);

②定义这一行的每个元素为j,根据我们上述规律[i][j] = [i-1][j] + [i-1][j-1]来遍历数组实现打印

for (int j = 1; j < i; j++) {
    //curRow[i][j] = [i-1][j] + [i-1][j-1];
    List<Integer> preRow = ret.get(i-1);
    int x = preRow.get(j) + preRow.get(j-1);
    curRow.add(x);
}

③每一行的最后一个元素也是固定不变的,也是元素1,所以我们直接在最后添加一个元素就ok了

curRow.add(1);
ret.add(curRow);

附上总的代码:

public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> ret = new ArrayList<>();//二维数组
    List<Integer> one = new ArrayList<>();
    one.add(1);
    ret.add(one);

    //i代表每一行
    for (int i = 1; i < numRows; i++) {
        List<Integer> curRow = new ArrayList<>();
        //这一行开始的1
        curRow.add(1);
        //j代表这一行的每个元素
        for (int j = 1; j < i; j++) {
            //curRow[i][j] = [i-1][j] + [i-1][j-1];
            List<Integer> preRow = ret.get(i-1);
            int x = preRow.get(j) + preRow.get(j-1);
            curRow.add(x);
        }
        //j == i 这一行最后的一个1
        curRow.add(1);
        ret.add(curRow);
    }
    return ret;
}

 

🌴二.相同字符的截取

给定两串字符串s1,s2
要求:去掉第一串字符串当中所有的第二串字符串当中的字符

示例:
输入字符串:

String s1 = “welcome to my world”;
String s2 = “come”;

输出:

wl t y wrld

在思考这一题的代码实现中,我们先从边角开始考虑

  1. 先考虑特殊情况,两串字符串中有任何一个字符串为空的时候,或者长度为空,我们就需要把它置为空
if(s1 == null || s2 == null){
    return null;
}
if(s1.length() == 0 || s2.length() == 0){
    return null;
}
  1. 创建链表
List<Character> ret = new ArrayList<>();
  1. 对第一串字符串进行遍历,然后记录下每个元素下角标,用第二串数组中的元素进行比较,去掉出现相同的字符串,最后返回未出现相同字符的元素
for (int i = 0; i < s1.length(); i++) {
    char ch = s1.charAt(i);
    if(!s2.contains(ch+"")){
        ret.add(ch);
    }
}

此处简单介绍两种方法:

①charAt()方法是用来检索特定索引下的字符的String实例的方法,返回指定索引位置的char值,索引范围为0~length()-1
②contains()方法是当且仅当此字符串包含指定的char值序列时,返回true。

最后在我们主函数里就可以进行相应的操作了:

public static void main(String[] args) {
    String s1 = "welcome to my world";
    String s2 = "come";
    List<Character> ret = func(s1,s2);
    for (char ch:ret) {
        System.out.print(ch);
    }
    System.out.println();
}

如上执行的结果:
【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

附上总代码:

public static List<Character> func(String s1,String s2){
    if(s1 == null || s2 == null){
        return null;
    }
    if(s1.length() == 0 || s2.length() == 0){
        return null;
    }
    List<Character> ret = new ArrayList<>();
    for (int i = 0; i < s1.length(); i++) {
        char ch = s1.charAt(i);
        if(!s2.contains(ch+"")){
            ret.add(ch);
        }
    }
    return ret;
}

public static void main(String[] args) {
    String s1 = "welcome to my world";
    String s2 = "come";
    List<Character> ret = func(s1,s2);
    for (char ch:ret) {
        System.out.print(ch);
    }
    System.out.println();
}

 

🌲三.扑克牌

要求我们自己写一副扑克牌

①:完成刚买牌的顺序打印出来
②:我们再完成洗牌随机打乱顺序
③:三个人轮流每个人揭5张牌
④:还要输出最后剩余的牌

  1. 我们需要先创建一副牌,用来我们一系列的操作,单独创建一个Card类,定义花色和数字,写带两个参数的构造方法,以及getter和setter方法,重写ToString方法
class Card {
    private String suit;
    private 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+" ]";
    }
}

  1. 写一个刚买的牌,按照花色和顺序打印出来,J,Q,K我们按照数字11,12,13来打印,再把花色和序号融合在一起组成每个牌每个花色
public static final String[] suits = {"♥","♠","♣","♦"};

public static List<Card> buyCard() {
    List<Card> desk = new ArrayList<>();
    for (int i = 0; i < 4; i++) {
        for (int j = 1; j <= 13 ; j++) {
            String suit = suits[i];
            Card card = new Card(suit,j);
            desk.add(card);
        }
    }
    return desk;
}

最后运行出来的一副新牌就是按照花色的数字从小到大依次打印

  1. 洗牌后随机打乱的函数,那我们如何很好的打乱呢?交换每个元素的下标,让它遍历的时候随机和其他元素下标交换,达到我们的目的,在此处我们还可以优化一下,让下标随机数取元素长度里的任何一个下标,所以反向遍历更好
public static void shuffle(List<Card> cardList) {
    for (int i = cardList.size()-1; i > 0 ; i--) {
        Random random = new Random();
        int index = random.nextInt(i);
        swap(cardList,i,index);
    }
}

在这里我们提及之前学过的元素交换:

int tmp = array[i];
array[i] = array[j];
array[j] = tmp;

所以这里的swap函数就仿照这个来写

private 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);
}
  1. 五个人每个人都轮流揭五张牌,最后揭的牌还需要删除,方便后面我们打印剩余的牌
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 3; j++) {
        //每次揭牌都去获取 cardList的0下标的数据【删除】
        Card card = cardList.remove(0);
        List<Card> hand = hands.get(j);
        hand.add(i,card);//这里使用add 不能是set
        /*hands.get(j).add(card);*/
    }
}
  1. 当我们此时打印cardList就是剩余的牌了,然后把所有的代码执行结果打印出来(此处主函数省略了,在后面总代码中有,结果截图只有部分结果)
    【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌

附上总代码:文章来源地址https://www.toymoban.com/news/detail-438340.html

class Card {
    private String suit;
    private 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+" ]";
    }
}

public class TestCard {
    public static final String[] suits = {"♥","♠","♣","♦"};
    
    public static List<Card> buyCard() {
        List<Card> desk = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13 ; j++) {
                String suit = suits[i];
                Card card = new Card(suit,j);
                desk.add(card);
            }
        }
        return desk;
    }

    public static void shuffle(List<Card> cardList) {
        for (int i = cardList.size()-1; i > 0 ; i--) {
            Random random = new Random();
            int index = random.nextInt(i);
            swap(cardList,i,index);
        }
    }

    private static void swap(List<Card> cardList,int i,int j) {
        /*
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
         */
        Card tmp = cardList.get(i);

        cardList.set(i,cardList.get(j));

        cardList.set(j,tmp);
    }
    
    public static void main(String[] args) {
        List<Card> cardList = buyCard();
        System.out.println("买牌:"+cardList);
        shuffle(cardList);
        System.out.println("洗牌:"+cardList);

        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();

        List<List<Card>> hands = new ArrayList<>();
        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);

        // 5个人  轮流揭牌5张 i=0就是第一次
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                //每次揭牌都去获取 cardList的0下标的数据【删除】
                Card card = cardList.remove(0);
                List<Card> hand = hands.get(j);
                hand.add(i,card);//这里使用add 不能是set
                /*hands.get(j).add(card);*/
            }
        }

        System.out.println("第1个人的牌:"+hand1);
        System.out.println("第2个人的牌:"+hand2);
        System.out.println("第3个人的牌:"+hand3);

        System.out.println("剩余的牌:"+cardList);
    }
}

到了这里,关于【数据结构与算法】杨辉三角,相同字符的截取以及扑克牌的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [LeetCode] #118 杨辉三角

    给定一个非负整数  numRows , 生成「杨辉三角」的前  numRows   行。 在「杨辉三角」中, 每个数是它左上方和右上方的数的和。 杨辉三角:  

    2024年02月15日
    浏览(34)
  • 打印杨辉三角

    这个公式,不好算,我觉得还是杨辉三角算起来方便:c#代码如下:    double 打印杨辉三角(int n)//n必须是偶数,展开项是n+1,中间项是n/2,此处返回中间项的概率202306131722         {             //for (int i = 0; i n; i++)             //{             //    //这种方法直接算,使

    2024年02月09日
    浏览(37)
  • C练习——杨辉三角

    题目: 打印近似杨辉三角,行数n自选 百度找的杨辉三角,参考一下: 解析: 把它的全部元素左对齐,就可以看成近似杨辉三角的样子 1 1  1 1  2  1 1  3  3  1 1  4  6  4  1 ……  每个数等于它上方两数之和 每行数字左右对称,由1开始逐渐变大 行数与列数相同,第n行有

    2024年01月17日
    浏览(37)
  • 动态规划-杨辉三角

    该算法题分别是: 118. 杨辉三角。 119. 杨辉三角 II 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 1.2.1 示例 1: 输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 1.2.2 示例 2: 输入: numRows = 1 输出: [[1]] 1.2.3 提示: 1 = numRows = 30 来源:力扣(LeetCode) 链接:https://

    2024年02月13日
    浏览(40)
  • 【LeetCode】118. 杨辉三角

    题目链接 直觉解法: 以下的理论介绍 可以说和 本题的 代码实现 毫无关系。 这个版本 需要注意 列表的边界 思路: 前一行 两端 补0 模拟。 结合 动图 理解 题目 说明至少 一行,可以跳过 第一行的处理 官方版本

    2024年02月07日
    浏览(38)
  • 杨辉三角(Java)

     实现思路:我们可以先把杨辉三角想象成一个空的二维数组,然后再给它赋值输出即可。 关键在于如何赋值:仔细观察上图可以得出除了 每一行第一个数以及最后一个数(都是1) , 中间的数字规律就是: a[ i ][ j ] = a[ i - 1 ][ j - 1 ] + a[ i - 1 ][ j ] 实现代码: 相信大家更多的

    2024年02月08日
    浏览(35)
  • 【C语言】-- 杨辉三角

    目录 一.什么是杨辉三角? 二.实现方法 1.直角三角形版 2.等腰三角形版 杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。 形如: 我们不难看出其存在明显的规律。 即:图片的 两个斜边都是数字1 , 其余的数都等于 它所在层的肩上(

    2024年02月13日
    浏览(45)
  • 【LeetCode】探索杨辉三角模型

    力扣原题 首先我们要来了解一下题目本身在说些什么,通过下方的动图我们可以更加清楚地看到杨辉三角是怎样一步步生成的。 给到的示例中我们通过输入杨辉三角的行数,然后通过计算得到这个杨辉三角的每一行是什么具体的数值 首先我们要做的第一件事就是去选择正确

    2024年02月14日
    浏览(35)
  • leetcode-杨辉三角ii

    119. 杨辉三角 II 题解: 首先,我们需要创建一个列表来存储杨辉三角的每一行。 然后,我们需要计算每一行的元素。每一行的每个元素都是上一行的两个相邻元素的和。第一个和最后一个元素总是1。 最后,我们返回第rowIndex行。

    2024年01月19日
    浏览(46)
  • LC-杨辉三角-记忆版

    上一篇:LC-杨辉三角 上一篇讲了杨辉三角的算法,不过之前的算法存在一个问题,比如: 我们可以看到计算a[5][3]和a[5][4]时都需要a[4][3]的值,之前我们是需要每次用到都重新计算,这样就比较耗时,有没有办法记住已经算过的值呢,当下次用的时候直接获取就不用重新计算

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包