day57-day58【代码随想录】二刷数组

news2024/11/25 5:00:06

文章目录

  • 前言
  • 一、螺旋矩阵||(力扣59)
  • 二、螺旋矩阵(力扣54)
  • 三、顺时针打印矩阵(剑指 Offer29)
  • 四、在排序数组中查找元素的第一个和最后一个位置(力扣34)【二分查找】
  • 五、有多少小于当前数字的数字(力扣1365)
  • 六、有效的山脉数组(力扣941)【双指针】
  • 七、平均等待时间(力扣1701)
  • 八、独一无二的出现次数(力扣1207)
  • 每日一题:二进制数转字符串(力扣05.02)
  • 每日一题:保证文件名唯一(力扣1487)


前言

1、螺旋矩阵||
2、螺旋矩阵
3、顺时针打印矩阵
4、在排序数组中查找元素的第一个和最后一个位置
5、有多少小于当前数字的数字
6、有效的山脉数组
7、平均等待时间
8、独一无二的出现次数


一、螺旋矩阵||(力扣59)

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
在这里插入图片描述
注意:循环次数,以及只有一个字符时的情况,或者转完一圈后,剩一个字符的情况。绕啊绕

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;//循环次数
        int[][] res = new int[n][n];
        int count =1; 
        int start =0;
        int i,j;
 
        while(loop++<n/2){ 
            for(j=start;j<n-loop;j++){
                res[start][j] = count++;
            }
            for(i=start;i<n-loop;i++){
                res[i][j] = count++;
            }
            for(;j>=loop;j--){
                res[i][j] = count++;
            }
            for(;i>=loop;i--){
                res[i][j] = count++;
            }
            start++;
        }
        if(n%2==1){  //既包括了一个字符的情况 也包括了转完一圈后剩一个字符的情况
            res[start][start]=count;
        }
        return res;
    }
}

方法二:
该方法可以作为一个模板

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int left = 0;
        int right = n-1;
        int top = 0;
        int bottom = n-1;
        int count = 1;

    res[0][0] =1;

        while(true){
            for(int i=left;i<=right;i++){
                res[top][i] = count++;
            }
            if(++top>bottom) break;

            for(int j=top;j<=bottom; j++){
                res[j][right] = count++;
            }
            if(--right<left) break;

            for(int i=right;i>=left;i--){
                res[bottom][i] = count++;
            }
            if(--bottom<top) break;

            for(int j=bottom;j>=top;j--){
                res[j][left] = count++;
            }
            if(++left>right) break;
        }
        return res;
    }
}

二、螺旋矩阵(力扣54)

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<Integer>();

        int left = 0;
        int right = matrix[0].length-1;
        int top = 0;
        int bottom = matrix.length-1;

        while(true){
            for(int i=left;i<=right;i++){
                res.add(matrix[top][i]);
            }
            if(++top>bottom) break;

            for(int j=top;j<=bottom;j++){
                res.add(matrix[j][right]);
            }
            if(--right<left) break;

            for(int i=right;i>=left;i--){
                res.add(matrix[bottom][i]);
            }
            if(--bottom<top) break;

            for(int j=bottom;j>=top;j--){
                res.add(matrix[j][left]);
            }
            if(++left>right) break;
        }
        return res;

    }
}

三、顺时针打印矩阵(剑指 Offer29)

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
与上一题的区别,这道题可以从0开始,也就是一开始的matrix={}
此时如果
int bottom = matrix.length-1;
int right = matrix[0].length-1;
放在开头就会报错
在这里插入图片描述
因此需要加一行:

if(matrix.length==0 ||matrix[0].length==0){
            return new int[0];
        }
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        int top =0;
        int left = 0;
        
        if(matrix.length==0 ||matrix[0].length==0){
            return new int[0];
        }
        int bottom = matrix.length-1;
        int right = matrix[0].length-1;
        int[] res = new int[(bottom+1)*(right+1)];
        int k = 0;
        res[0]=1;

        while(true){
            for(int i=left;i<=right;i++){
                res[k++] = matrix[top][i];
            }
            if(++top>bottom) break;

            for(int j=top;j<=bottom;j++){
                res[k++] = matrix[j][right];
            }
            if(--right<left) break;

            for(int i=right;i>=left;i--){
                res[k++] = matrix[bottom][i];
            }
            if(--bottom<top) break;

            for(int j=bottom;j>=top;j--){
                res[k++] = matrix[j][left];
            }
            if(++left>right) break;
        }
        return res;
    }
}

四、在排序数组中查找元素的第一个和最后一个位置(力扣34)【二分查找】

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。

在这里插入图片描述

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int leftBorder = getLeftBoreder(nums,target);
        int rightBorder = getRightBoreder(nums,target);

        if(rightBorder==-2 || leftBorder==-2){
            return new int[]{-1,-1};
        }

        if(rightBorder-leftBorder>1){
            return new int[]{leftBorder+1,rightBorder-1};
        }
        else return new int[]{-1,-1};
    }
    public int getLeftBoreder(int[] nums, int target){
        int left = 0;
        int right = nums.length-1;
        int mid;
        int leftBorder=-2;
        while(left<=right){
            mid = (left+right)/2;
            if(nums[mid]>=target){
                right=mid-1;
                leftBorder = right;
            }else{
                left = mid +1;
            }
        }
        return leftBorder;
    }

    public int getRightBoreder(int[] nums, int target){
        int left = 0;
        int right = nums.length-1;
        int mid;
        int rightBorder=-2;
        while(left<=right){
            mid = (left+right)/2;
            if(nums[mid]<=target){
                left=mid+1;
                rightBorder = left;
            }else{
                right = mid -1;
            }
        }
        return rightBorder;
    }
}

五、有多少小于当前数字的数字(力扣1365)

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。
在这里插入图片描述

找个桶,这个桶用来存放每个数字出现的次数,然后依次遍历这个桶,处理桶中的数据
比如 在案例中
bucket[1] =1
bucket[2] =2
bucket[3] =1
bucket[8] =1
遍历桶的时候 :

		int count =0;
        for(int i=0;i<barcket.length;i++){
           int temp = barcket[i];
           barcket[i] = count;
           count +=temp;
        }

最后只取桶中我们需要的数据

class Solution {
    public int[] smallerNumbersThanCurrent(int[] nums) {
        //桶 存放数字n出现的次数
        int[] barcket = new int[101];
        for(int i:nums){
            barcket[i]++;
        }
        int[] res = new int[nums.length];
        int count =0;
        //处理桶
        for(int i=0;i<barcket.length;i++){
           int temp = barcket[i];
           barcket[i] = count;
           count +=temp;
        }
        int k=0;
        for(int i:nums){
            res[k++] = barcket[i];
        }
        return res;
    }
}

六、有效的山脉数组(力扣941)【双指针】

给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。
如果 arr 满足下述条件,那么它是一个山脉数组:
arr.length >= 3
在 0 < i < arr.length - 1 条件下,存在 i 使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
在这里插入图片描述

注意这个测试用例:
在这里插入图片描述
先上山, i=1;i<arr.length && arr[i]>arr[i-1];i++
如果 退出这个循环后 i依然等于1 或者i等于 arr.length时 说明上山上不动或者一次爬到终点两种情况 均return false

此时i指向最高点的下一位

再下山,;i<arr.length && arr[i-1]>arr[i];i++
如果退出循环后 i可以等于arr.length 说明下山成功 可以下到山脚
如果;i<arr.length && arr[i]>arr[i+1];i++ 退出循环后 i如果等于arr.length-1 这样子
就会出现测试用例的情况

class Solution {
    public boolean validMountainArray(int[] arr) {
        int i ;

        for(i=1;i<arr.length && arr[i-1]<arr[i];i++);
            //上山爬不动或者一次爬到终点
        if(i==1 || i==arr.length) return false;

        for(;i<arr.length-1 && arr[i]>arr[i+1];i++);
        return i==arr.length-1;
    }
}

七、平均等待时间(力扣1701)

有一个餐厅,只有一位厨师。你有一个顾客数组 customers ,其中 customers[i] = [arrivali, timei] :
arrivali 是第 i 位顾客到达的时间,到达时间按 非递减 顺序排列。
timei 是给第 i 位顾客做菜需要的时间。
当一位顾客到达时,他将他的订单给厨师,厨师一旦空闲的时候就开始做这位顾客的菜。每位顾客会一直等待到厨师完成他的订单。厨师同时只能做一个人的订单。厨师会严格按照 订单给他的顺序 做菜

在这里插入图片描述
类似于先来先服务调度算法 ,先计算到达时间, 开始时间不一定等于到达时间,可能上一位顾客结束比较晚,那么开始时间就应该等到上一位顾客结束之后 start 和arrival应该取较大值,然后等待时间累加即可

class Solution {
    public double averageWaitingTime(int[][] customers) {
   
    int start=0;
    double wait =0;
        for(int[] customer:customers){
            int arrivali = customer[0];
            start =Math.max(start,arrivali);  //一定要取最大值 [5,2],[5,4]
            start +=customer[1];  //结束时间
            wait += start-arrivali; //等待时间总和
        }
        return wait/customers.length;
    }
}

八、独一无二的出现次数(力扣1207)

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
在这里插入图片描述

class Solution {
    public boolean uniqueOccurrences(int[] arr) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int i:arr){
            map.put(i,map.getOrDefault(i,0)+1);
        } 
        //遍历数组 看数组有没有重复的值
        //统计不同的出现次数的数目。如果不同的出现次数的数目等于不同数字的数目
        Set<Integer> times = new HashSet<Integer>();
        for(Map.Entry<Integer,Integer> x:map.entrySet()){
            times.add(x.getValue());
        }
        return times.size() == map.size();   
    }
}

每日一题:二进制数转字符串(力扣05.02)

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

class Solution {
    public String printBin(double num) {
        StringBuilder ans = new StringBuilder();
        ans.append("0.");
        while(num>0 && ans.length()<=32){
            num = num*2.0;
            if(num>=1){
                ans.append("1");
                num=num-1;
            }else{
                ans.append("0");
            }
        }
        return ans.length() <= 32 ? ans.toString() : "ERROR";
    }
}

每日一题:保证文件名唯一(力扣1487)

给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。
由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。
返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。
在这里插入图片描述
创建一个哈希表,遍历names数组,拿到name之后去哈希表中看看有没有出现过,如果没有 names数组不需要做任何操作,哈希表需要记录一下 此name出现的次数为1。如果出现过,首先先获取一下出现了多少次,假设gta出现了1次,注意:不能直接在出现次数上+1=2 gta(2),而需要看看names中有没有这个次数 如果有 则次数需要继续++,并且需要修改map中该元素出现的次数。

class Solution {
    public String[] getFolderNames(String[] names) {
        Map<String,Integer> d = new HashMap<>();
        for(int i=0;i<names.length;i++){
            if(d.containsKey(names[i])){
                int k = d.get(names[i]);//获取出现的次数
                while(d.containsKey(names[i] + "(" +k+")")){
                    k++;
                }
                //更新值
                d.put(names[i],k);
                names[i] += "(" +k+ ")"; 
            }
            d.put(names[i],1);    
        }
        return names;
    }
}

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

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

相关文章

自动驾驶决策概况

文章目录1. 第一章行为决策在自动驾驶系统架构中的位置2. 行为决策算法的种类2.1 基于规则的决策算法2.1.1 决策树2.1.2 有限状态机&#xff08;FSM&#xff09;2.1.3 基于本体论&#xff08;Ontologies-based&#xff09;2.2 基于统计的决策算法2.2.1 贝叶斯网络&#xff08;B…

智慧制硅厂 Web SCADA 生产线

我国目前是全球最大的工业硅生产国、消费国和贸易国&#xff0c;且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识&#xff0c;随着我国“双碳”目标的推进&#xff0c;光伏产业链快速发展&#xff0c;在光伏装机需求的带动下&#xff0c;…

flink兼容性验证

flink介绍&#xff1a;https://blog.csdn.net/weixin_43563705/article/details/107604693 一、安装启动 安装flink及其依赖 yum install java-1.8.0-openjdk curl tar mkdir -p /usr/local/flink wget https://mirrors.aliyun.com/apache/flink/flink-1.16.1/flink-1.16.1-bi…

如何校招进BAT做产品经理

嗨&#xff0c;很高兴&#xff0c;以文字的形式和你见面。在校招中&#xff0c;我拿到了百度、京东、爱奇艺、新浪和去哪儿的产品经理校招offer&#xff0c;其中百度是special offer。在找实习的过程中&#xff0c;也拿到了爱奇艺、微信电影票、搜狐畅游、艺龙等公司的产品经理…

Ac4GlcNAz,98924-81-3,N-乙酰葡糖胺叠氮基,可以进行糖化学修饰

Ac4GlcNAz反应特点&#xff1a;四乙酰氨基叠氮氨基葡萄糖&#xff08;Ac4GlcNAz&#xff0c;98924-81-3&#xff09;为糖缀合物可视化提供非放射性替代物。西安凯新生物科技有限公司供应的解释道它是细胞通透性、细胞内处理和结合的&#xff0c;而不是其天然单糖对乙酰氨基葡萄…

CEC2017:斑马优化算法(Zebra Optimization Algorithm,ZOA)求解cec2017(提供MATLAB代码)

一、斑马优化算法 斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#xff09;Eva Trojovsk等人于2022年提出&#xff0c;其模拟斑马的觅食和对捕食者攻击的防御行为。 斑马因身上有起保护作用的斑纹而得名。没有任何动物比斑马的皮毛更与众不同。斑…

SpringCloud的基本使用

文章目录一.单体架构和分布式架构的区别1.单体架构2.分布式架构二.微服务1.微服务的架构特征2.微服务技术对比3.企业需求4.微服务的远程定义5.提供者与消费者三.Eureka注册中心1.eureka的作用2.搭建EurekaServer3.Eureka注册3.服务拉取四.Ribbon负载均衡1.负载均衡流程2.负载均…

总被程序员坑?你需要了解API接口

编辑导读&#xff1a;程序员是公司里的技术岗&#xff0c;也是产品经理最密切的合作伙伴。但是&#xff0c;程序员能看懂产品经理的工作&#xff0c;产品经理却不一定能明白程序员的工作&#xff0c;因此也常常被无良程序员坑。本文就从API接口的维度&#xff0c;浅析API的概念…

十七、本地方法接口的理解

什么是本地方法? 1.简单来讲&#xff0c;一个Ntive method 就是一个Java调用非Java代码的接口.一个Native Method 是这样一个Java方法:该方法的实现由非Java语言实现&#xff0c;比如C,这个特征并非Java所特有&#xff0c;很多其他的编程语言都由这一机制&#xff0c;比如在C中…

常见HTTP攻击赏析(1)

基于OpenAPI的APIcat开源日志监控软件已经开发一段时间了&#xff0c;在自己的网站上抓到了一些HTTP的攻击&#xff0c;没事&#xff0c;我们就汇总给大家做个赏析&#xff0c;也当是个提醒。 对应的OpenAPI定义上传到了百家饭平台 API攻击样例详情百家饭OpenAPI平台主站http…

最新会声会影2023旗舰版更新了哪些功能?

会声会影在用户的陪伴下走过26余载&#xff0c;经过上百个版本的优化迭代&#xff0c;已将操作极大简易化&#xff0c;会声会影拥有公认的上手口碑。只需将想要的效果拖拽到轨道上&#xff0c;一拖一放间快速成片。专业工具助力视频剪辑操作简单&#xff0c;功能同样强大&#…

Ubuntu 新人上手 Microk8s 指南

文章目录1. 什么是 Ubuntu 核心2. 什么是 Kubernetes3. 什么是MicroK8s4. 为什么选择 Microk8s on Core5. 安装Ubuntu Core6. Ubuntu Core上安装 MicroK8S7. 启动 Microk8s8. 启用必要的 MicroK8s 插件9. 部署示例容器工作负载10. 检查部署状态并访问您的应用程序11. 管理镜像1…

docker布署spring boot jar包项目

目录docker 安装创建目录制作镜像启动容器查看日志docker 安装 Docker安装、详解与部署 创建目录 服务器中创建一个目录&#xff0c;存放项目jar包和Dockerfile 文件 mkdir /目录位置创建目录后创建Dockerfile文件&#xff0c;上传jar包到同一目录下 创建dockerfile vim Doc…

一文读懂Java/O流的使用方法和技巧

1.前言 Java 中的 I/O 流是实现输入和输出的一种机制&#xff0c;可以用来读写文件、网络、内存等各种资源。Java 提供了各种类型的流&#xff0c;包括字节流和字符流&#xff0c;以及面向文本和二进制数据的流。在本文中&#xff0c;我们将深入探讨 Java I/O 流的各个方面&am…

空指针,野指针

空指针在C/C中&#xff0c;空指针&#xff08;null pointer&#xff09;是指向内存地址0的指针变量。NULL在C/C中的定义为&#xff1a;#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif #endif从上面的代码定义中&#xff0c;我们可以发现在C…

【数据聚类|深度聚类】Deep Comprehensive Correlation Mining for Image Clustering(DCCM)论文研读

Abstract 翻译 最近出现的深度无监督方法使我们能够联合学习表示和对未标记数据进行聚类。这些深度聚类方法主要关注样本之间的相关性,例如选择高精度对来逐步调整特征表示,而忽略了其他有用的相关性。本文提出了一种新的聚类框架,称为深度全面相关挖掘(DCCM),从三个方面…

APP自动化(2)-【耗时3天爬出几个坑终于完成】appium连接手机模拟器,python对操作手机打开微信

上一篇已经熟悉了appium常用的命令 APP自动化&#xff08;1&#xff09;-Appium中adb常用命令 本篇主要是通过python连接appium对手机的一个操作。 后续的appium和nodejssdk安装都需要按照下面这篇文章的来跑 PythonAppium从安装到第一个小练习(保姆级别教程) 然后就是全部环境…

经纬恒润助力微宏动力荣获ISO 26262功能安全ASIL C产品认证证书

近日&#xff0c;经纬恒润与微宏动力合作的BMS4.0平台功能安全开发项目完美收官&#xff0c;该平台产品获得ISO 26262:2018 ASIL C 功能安全产品认证证书 以及 ASIL D 功能安全流程体系证书。该项目以微宏动力为实施主体&#xff0c;经纬恒润功能安全咨询团队提供支持&#xff…

《ChatGPT是怎样炼成的》

ChatGPT 在全世界范围内风靡一时&#xff0c;我现在每天都会使用 ChatGPT 帮我回答几个问题&#xff0c;甚至有的时候在一天内我和它对话的时间比和正常人类对话还要多&#xff0c;因为它确实“法力无边&#xff0c;功能强大”。 ChatGPT 可以帮助我解读程序&#xff0c;做翻译…

2023爱分析·一体化HR SaaS市场厂商评估报告:北森

目录 1.研究范围定义 2. 一体化HR SaaS市场分析 3.厂商评估&#xff1a;北森 4.入选证书 1.研究范围定义 研究范围 伴随数字化转型走向深入&#xff0c;企业人力资源数字化也进入快速发展阶段&#xff0c;人力资源的价值也得到了重新审视和定义。政策层面&#xff0c;《…