【数据结构】顺序表(杨辉三角、简单的洗牌算法)

news2024/11/16 21:57:51

🎇🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!
欢迎志同道合的朋友一起加油喔 💪💪💪
谢谢你这么帅气美丽还给我点赞!比个心**

文章目录

  • 一、面试题(CVTE)
    • 1. 题目描述
    • 2. 要求及解析
    • 3. 代码展示
    • 4. 注意点
  • 二、杨辉三角
    • 1. 题目
    • 2. 画图解析
    • 3. 知识点
    • 4. 代码展示
  • 三、简单的洗牌算法
    • 1. 理解怎么玩扑克牌
    • 2. 抽象出一张扑克牌
    • 3. 买牌
    • 4. 洗牌
    • 5. 发牌
    • 6. 测试类
    • 7. 对牌进行操作方法的完整代码
  • 四、移除元素
    • 1. 示例 1:
    • 2. 示例 2:
    • 3. 求解代码

一、面试题(CVTE)

1. 题目描述

有两个字符串
         字符串1: welcome to cvte  
         字符串2: come
         结果:   wl t vt

2. 要求及解析

要求删除字符串1中所包含的字符串2中的字符
即删除字符串1中所有的c o  m e 这四个字符

在这里插入图片描述

3. 代码展示

package test;
import java.util.ArrayList;
import java.util.List;
public class Test {
    public static void main(String[] args) {
        List<Character> arrayList = new ArrayList<>();
        String str1 = "welcome to cvte";
        String str2 = "come";
        List<Character> ret = func(str1, str2);
        //利用 for - each 循环
        for (char ch : ret){
            System.out.print(ch);
        }
        System.out.println();
    }

    private static List<Character> func(String str1, String str2) {
        List<Character> list = new ArrayList<>();
        //首先遍历 str1
        for (int i = 0; i < str1.length(); i++) {
            //取出来str1中的每个字符
            char ch = str1.charAt(i);
            //在 str2 中进行判断是否存在
            if (!str2.contains(ch + "")){
                list.add(ch);
            }
        }
        return list;
    }
}

4. 注意点

以下两行代码有什么区别在使用上?

List<Character> arrayList = new ArrayList<>();
//只能调用接口当中的方法

ArrayList<Character> arrayList1 = new ArrayList<>();
//可以调用当前类自己的方法和接口当中的方法

在这里插入图片描述

二、杨辉三角

杨辉三角

1. 题目

在这里插入图片描述

2. 画图解析

在这里插入图片描述

3. 知识点

 List<List<Integer>> ret = new ArrayList<>();
 //定义了一个二维数组

在这里插入图片描述

4. 代码展示

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();

        //第一行 数组
        //在二维数组里面 第一行数组的下标为 0
        List<Integer> list = new ArrayList<>();
        list.add(1);
        //把第一行一维数组放到 二位数组的 0 下标
        ret.add(list);

        //处理其他行
        for (int i = 1; i < numRows; i++) {
            //每循环一次 就是 一行
            //创建一个一维数组
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1);//每一行的第一个元素
            //处理中间的数字
            //要获取上一行一维数组
            List<Integer> prevRow = ret.get(i - 1);

            //从第二列开始
            for (int j = 1; j < i; j++) {
                int x = prevRow.get(j) + prevRow.get(j - 1);
                curRow.add(x);
            }
            //处理最后一个数字
            curRow.add(1);
            ret.add(curRow);
        }
        return ret;
    }
}

三、简单的洗牌算法

1. 理解怎么玩扑克牌

买牌、洗牌,发牌(根据人数)

在这里插入图片描述

2. 抽象出一张扑克牌

package demo;

//抽象出来一张牌

public class Card {
    public String suit;//花色
    public int num;//数字

    //如果要构造一张牌,要提供构造方法

    public Card(String suit, int num) {
        this.suit = suit;
        this.num = num;
    }

    @Override
    public String toString() {
//        return "Card{" +
//                "suit='" + suit + '\'' +
//                ", num=" + num +
//                '}';

        return suit + "" + num;
    }
}

3. 买牌

//定义扑克牌的4种花色  红桃,梅花,方块,黑桃
    public static String[] suits = {"♥","♣","♦","♠"};

    //首先需要买牌,没有牌这怎么玩
    //买的牌放到哪里呢

    /**
     * 生成一副扑克牌
     * 52张 不包含大小王
     * 4种花色 每种花色 13 张
     * @return
     */
    public List<Card> buyCard(){
        List<Card> cardList = 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);
//                cardList.add(card);

                cardList.add(new Card(suits[i],j));
            }
        }
         return cardList;
    }

4. 洗牌

在这里插入图片描述

//洗牌 ---》》传一副扑克牌
    //洗牌需要什么呢? ---》》 扑克牌
    //扑克牌在哪放着呢? ----》》数组里面
    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 方法进行交换
            swap(cardList,i,index);
        }
    }

    private static void swap(List<Card> cardList,int i,int j) {
        //首次从数组里面获取i下标的牌
        //利用面向对象的方式去做
        Card tmp = cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }

5. 发牌

/**
     * 发牌
     * 3个人,每个人轮流抓 5 张牌
     * 1.每个人拿到的牌放到哪里?
     * 2.什么叫做 每个人轮流抓 5 张牌?
     * @param cardList
     */
    public List<List<Card>> getCard(List<Card> cardList){
        List<List<Card>> hand = new ArrayList<>();
        //应该有 三个 一维数组,三位玩家放各自的扑克牌

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

        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

        //每个人抓5次
        //利用for循环
        for (int i = 0; i < 5; i++) {
            //每一次有三个人
            for (int j = 0; j < 3; j++) {
                //怎么揭牌???
                //相当于每次 拿 0下标的牌(删除0下标的牌就行)
                Card card = cardList.remove(0);
                //放到对应人的手里
                hand.get(j).add(card);
            }
        }
        return hand;
    }

6. 测试类

package demo;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        CardGame cardGame = new CardGame();
        List<Card> ret = cardGame.buyCard();
        System.out.println("买牌:");
        System.out.println(ret);

        System.out.println("洗牌:");
        cardGame.shuffle(ret);
        System.out.println(ret);

        System.out.println("发牌:");
        List<List<Card>> hand = cardGame.getCard(ret);
//        for (List<Card> cards : hand){
//            System.out.println(cards);
//        }
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第" + (i + 1) + "个人的牌为:");
            System.out.println(hand.get(i));
        }

        System.out.println("剩下的牌:");
        System.out.println(ret);
    }
}

7. 对牌进行操作方法的完整代码

package demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import static java.util.Collections.swap;

public class CardGame {
    //定义扑克牌的4种花色  红桃,梅花,方块,黑桃
    public static String[] suits = {"♥","♣","♦","♠"};

    //首先需要买牌,没有牌这怎么玩
    //买的牌放到哪里呢

    /**
     * 生成一副扑克牌
     * 52张 不包含大小王
     * 4种花色 每种花色 13 张
     * @return
     */
    public List<Card> buyCard(){
        List<Card> cardList = 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);
//                cardList.add(card);

                cardList.add(new Card(suits[i],j));
            }
        }
         return cardList;
    }

    //洗牌 ---》》传一副扑克牌
    //洗牌需要什么呢? ---》》 扑克牌
    //扑克牌在哪放着呢? ----》》数组里面
    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 方法进行交换
            swap(cardList,i,index);
        }
    }

    private static void swap(List<Card> cardList,int i,int j) {
        //首次从数组里面获取i下标的牌
        //利用面向对象的方式去做
        Card tmp = cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }

    /**
     * 发牌
     * 3个人,每个人轮流抓 5 张牌
     * 1.每个人拿到的牌放到哪里?
     * 2.什么叫做 每个人轮流抓 5 张牌?
     * @param cardList
     */
    public List<List<Card>> getCard(List<Card> cardList){
        List<List<Card>> hand = new ArrayList<>();
        //应该有 三个 一维数组,三位玩家放各自的扑克牌

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

        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

        //每个人抓5次
        //利用for循环
        for (int i = 0; i < 5; i++) {
            //每一次有三个人
            for (int j = 0; j < 3; j++) {
                //怎么揭牌???
                //相当于每次 拿 0下标的牌(删除0下标的牌就行)
                Card card = cardList.remove(0);
                //放到对应人的手里
                hand.get(j).add(card);
            }
        }
        return hand;
    }
}

四、移除元素

  • 给你一个数组nums和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与val不同的元素的数量。

  • 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。

  • 返回k
    用户评测:

评测机将使用以下代码测试您的解决方案:
int[] nums = […]; // 输入数组
int val = …; // 要移除的值
int[] expectedNums = […]; // 长度正确的预期答案。
// 它以不等于 val 的值排序。
int k = removeElement(nums, val); // 调用你的实现
assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {
assert nums[i] == expectedNums[i];
}
如果所有的断言都通过,你的解决方案将会 通过。

1. 示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2, _ , _ ]
解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

2. 示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3, _ , _ , _ ]
解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100

3. 求解代码

class Solution {
    public int removeElement(int[] nums, int val) {
        //利用双指针
        int n = nums.length;
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val){
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1949727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】GPT LoRA:大模型微调的艺术与效率

文章目录 往期热门专栏回顾1、前言介绍 1.1、文生图效果 2、LoRA的工作原理3、LoRA的应用场景4、LoRA的优势5、LoRA的挑战6、LoRA的实现7、未来展望 1、前言介绍 在深度学习和自然语言处理领域&#xff0c;大规模预训练模型&#xff08;如GPT-3、BERT等&#xff09;已经展示了…

ansible基础讲解和加密文件讲解

ansible最重要的三个文件 /etc/ansible/ansible.cfg #####ansible的配置文件 /etc/ansible/host ##清单文件inventory ansible-navigator.yml ####以yml结尾的文件可以理解为conf结尾的文件&#xff0c;是配置文件&#xff0c;用于设置剧本playbook playbook讲解 以.yml结…

【Android】Activity与Fragment的数据传递

上一篇文章学到了碎片的创建与生命周期&#xff0c;接下来学习碎片的常用操作&#xff0c;其中会用到上一篇文章的三个碎片&#xff0c;就做一个简单的说明吧&#xff1a;LeftFragment&#xff08;包含一个按钮&#xff09;、RightFragment4&#xff08;以粉色为背景的文本&…

优化医疗数据管理:Kettle ETL 数据采集方案详解

在现代医疗保健领域&#xff0c;数据的准确性、完整性和及时性对于提高医疗服务质量和患者护理至关重要。为了有效管理和利用医疗数据&#xff0c;Kettle ETL&#xff08;Extract, Transform, Load&#xff09;数据采集方案成为了许多医疗机构的首选工具之一。本文将深入探讨Ke…

【Gitlab】SSH配置和克隆仓库

生成SSH Key ssh-keygen -t rsa -b 4096 私钥文件: id_rsa 公钥文件:id_rsa.pub 复制生成的ssh公钥到此处 克隆仓库 git clone repo-address 需要进行推送和同步来更新本地和服务器的文件 推送更新内容 git push <remote><branch> 拉取更新内容 git pull &…

MySQL数据库的DQL的高级数据查询语句

目录 非等值联查&#xff1a; 等值联查&#xff1a; eg&#xff1a;5张表联查 连接查询——left/right/inner join on eg: 连接查询——union Eg&#xff1a; 不去重的并集——union all 子查询&#xff08;内部查询&#xff09; 1、where型子查询 2、from型子查询&a…

Servlet2-HTTP协议、HttpServletRequest类、HttpServletResponse类

目录 HTTP协议 什么是HTTP协议 HTTP协议的特点 请求的HTTP协议格式 GET请求 POST请求 常用的请求头说明 哪些是GET请求&#xff0c;哪些是POST请求 响应的HTTP协议格式 常见的响应码说明 MIME类型说明 HttpServletRequest类 作用 常用方法 如何获取请求参数 po…

Linux:基础

一、安装 二、 一些组件 2.1 git管理 集中式版本控制系统:版本库是集中存放在中央服务器的,需要时要先从中央服务器取得最新的版本进行修改,修改后再推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,网速慢的话影响太大。 分布式版本控制系统:分布…

MySQL SQL 编程练习

目录 创建表并插入数据 查看表结构 创建触发器 创建INSERT 触发器 创建DELETE 触发器 创建更新触发器 创建存储过程 创建提取emp_new表所有员工姓名和工资的存储过程s1 创建存储过程s2&#xff0c;实现输入员工姓名后返回员工的年龄 创建一个存储过程s3&#xff0c;有2个参数&…

Apache ShardingSphere Proxy5.5.0实现MySQL分库分表与读写分离

1. 前提准备 1.1 主机IP:192.168.186.77 version: 3.8services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL_DATABASE: db1 ports:- "3306:3306&quo…

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 服务端配置&#xff1a; 客户端测试&#xff1a; 2、搭建一个Web服务器&#xff0c;客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置&#xff1a; 客户端…

UE5+OpenCV配置(Windows11系统)

一、概述 因为需要在UE5中使用OpenCV这些工具进行配置&#xff0c;所以在网络上参考借鉴一些资料进行配置。查询到不少的资料&#xff0c;最后将其配置成功。在这里顺便记录一下自己的配置成功的过程。 二、具体过程 &#xff08;一&#xff09;版本 使用Windows11系统、UE5.…

vue3前端开发-小兔鲜项目-路由拦截器增加token的携带

vue3前端开发-小兔鲜项目-路由拦截器增加token的携带&#xff01;实际开发中&#xff0c;很多业务接口的请求&#xff0c;都要求必须是登录状态&#xff01;为此&#xff0c;这个token信息就会频繁的被加入到了请求头部信息中。request请求头内既然需要频繁的携带这个token.我们…

百易云资产管理运营系统 comfileup.php 文件上传致RCE漏洞复现(XVE-2024-18154)

0x01 产品简介 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能,帮助企业优化资产配置,提升运营效率。 0x02 漏…

BUUCTF [安洵杯 2019]easy_serialize_php

这道题题目说easy但是对我来说极其不友好&#xff01;看了很多wp讲的模棱两可&#xff0c;我尽量来说清楚点 代码解析&#xff1a; 这里$function $_GET[f]&#xff0c;是我们通过get方式传递的&#xff0c;因为注释提示有东西先传fphpinfo看看 找到了一个东西&#xff0c;很…

linux下usb抓包:wireshark+usbmon

step1. 加载usbmon模块 sudo mount -t debugfs none /sys/kernel/debug #这一步一般不用做&#xff0c;debugfs默认都是挂载的 sudo modprobe usbmon #如果这个命令找不到usbmon&#xff0c;那手动从/lib/modules中insmod sudo apt-get install wireshark 若加载成功&…

收银系统对零售连锁门店有什么作用?

随着人们生活水平的提高&#xff0c;各类零售门店也越来越多&#xff0c;对于零售连锁门店来说&#xff0c;如何提高客流量和客户忠诚度&#xff0c;提高会员的单次消费能力是一个重大的问题&#xff0c;能够决定性影响门店盈利额&#xff1b;从收银软件出发&#xff0c;一款好…

【文心智能体】00后疯感工牌生成器,低代码工作流的简单应用以及图片快速响应解决方案,干活满满,不容错过哦

背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风口显然已随之到来。 如何能把握住时代红利&#xff0c;占据风口&#xff0c;甚至打造新风向&#x…

设计模式14-享元模式

设计模式14-享元模式 由来动机定义与结构代码推导特点享元模式的应用总结优点缺点使用享元模式的注意事项 由来动机 在很多应用中&#xff0c;可能会创建大量相似对象&#xff0c;例如在文字处理器中每个字符对象。在这些场景下&#xff0c;如果每个对象都独立存在&#xff0c…