杨辉三角(java中ArrayList实际应用)

本文介绍了编程中的三个经典问题:1. 使用Java实现杨辉三角的生成;2. 创建并操作扑克牌,包括洗牌和发牌功能;3. 实现原地移除数组元素和删除排序数组中的重复项。这些例子展示了数组操作和算法在编程中的应用。
摘要由CSDN通过智能技术生成

1.杨辉三角(简单)

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

题目来源:力口(LeetCode)

示例 1:

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

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

代码实现:

class Solution {               //使用leetcode题目框架
    public List<List<Integer>> generate(int numRows) {
  List sanjiao=new ArrayList<>();//三角形
        List<Integer> row1=new ArrayList<>();//行
        row1.add(1);                //第一行特例只有一个1
        sanjiao.add(row1);            //将第一行添加到三角形中
        for (int i = 1; i <numRows; i++) {            //2-n行具有相同特征
            List<Integer> row=new ArrayList<Integer>();
            row.add(1);                            //每一行的第一个元素都是1

for(int j=1;j<=(i-1);j++){
    List<Integer> rooww= (List<Integer>) sanjiao.get(i-1);
    int left=rooww.get(j-1);                       //获取三角形中的上一行数据
int right=rooww.get(j);
int sum=left+right;
row.add(sum);

}
row.add(1);                                        //每一行的最后一个元素都是1
            sanjiao.add(row);
        }
        return sanjiao;
    }
}

2.扑克牌

ArrayList实际应用——创建一副扑克牌,并实现洗牌发牌等功能

public class Poker {
public String suit;//花色
public int rank;//数值
    @Override
    public String toString() {
        return String.format("[%s %d]", suit, rank);
    }

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

public class CardDemo {
    public static   final String[] suits={"♦","♣","♥","♠"};
    //买一副新牌(初始化)
    //deck是一副牌,poker是一张牌
    private static List<Poker>buyDeck(){
        List<Poker> deck=new ArrayList<>(52);
        for (int i = 0; i <4; i++) {
            for (int j = 0; j <14; j++) {
                String suit=suits[i];
                int rank=j;
                Poker poker=new Poker();        //初始化一张牌
                poker.rank=rank;
                poker.suit=suit;

                deck.add(poker);        //将一张牌添加到一副牌中
            }
        }
        return deck;
    }

//牌进行交换
    private static  void swap(List<Poker> deck,int i ,int j){
        Poker t= deck.get(i);       //设置临时变量保存目标下标
        deck.set(i,deck.get(j));
        deck.set(j,t);
    }
    //以随机交换的形式进行洗牌
    private static void xipai(List<Poker> deck){
        Random random=new Random(52);
        for (int i = 1; i <=52; i++) {
            int z= random.nextInt(i);
            swap(deck,i,z);
        }
    }

    public static void main(String[] args) {
        List<Poker> deck=buyDeck(); //初始化
        System.out.println("买一副新扑克牌");
        System.out.println(deck);
        //洗牌
        xipai(deck);
        System.out.println("洗牌后:"+deck);
        //假设三个人玩
        List<List<Poker>> hands=new ArrayList<>();
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());
//发牌
        for (int i = 0; i <14; i++) {
            for (int j = 0; j < 3; j++) {
                hands.get(j).add(deck.remove(0));
            }
        }
        System.out.println("第一个人的牌:"+hands.get(0));
        System.out.println("第二个人的牌:"+hands.get(1));
        System.out.println("第三个人的牌:"+hands.get(2));
    }
}

运行结果:

3.移除元素

题目描述:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

来源:力口(LeetCode)

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

class Solution {
    public int removeElement(int[] nums, int val) {
        int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=val){
    nums[j]=nums[i];
    j++;
}

}
return j;
    }
}

4.删除排序数组中的重复项

题目描述:

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

来源:力口(LeetCode)

示例 1:输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

class Solution {
    public int removeDuplicates(int[] nums) {
int j=1;
for(int i=1;i<nums.length;i++){
    if(nums[i]!=nums[i-1]){
nums[j]=nums[i];                             
j++;
    }
}
return j;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值