牛客剑指offer刷题模拟篇

news2024/12/22 19:22:37

文章目录

      • 顺时针打印矩阵
        • 题目
        • 思路
        • 代码实现
      • 扑克牌顺子
        • 题目
        • 思路
        • 代码实现
      • 把字符串转换成整数
        • 题目
        • 思路
        • 代码实现
      • 表示数值的字符串
        • 题目
        • 思路
        • 代码实现

顺时针打印矩阵

题目

描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]
则依次打印出数字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
数据范围:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
牛客题目链接

思路

顺时针打印矩阵
我们主要分析以下几种情况

  1. 只有一行的时候,我们只需要遍历打印即可;
  2. 只有一列的时候,我们同样只需要遍历打印即可;
  3. 对于多行多列的情况,我们需要按照规定的顺序进行打印;
代码实现
    private ArrayList<Integer> result = new ArrayList<>();

    public ArrayList<Integer> printMatrix(int[][] matrix) {
        if (matrix == null || matrix[0] == null || matrix[0].length == 0) {
            return result;
        }
        int tR = 0; //表示第一行下标
        int tC = 0; //表示第一列下标
        int index = 0; //表示当前集合下标
        int dR = matrix.length - 1; //最后一行下标
        int dC = matrix[0].length - 1; //最后一列下标
        while (tR <= dR && tC <= dC) { 
            printMatrix(matrix, tR++, tC++, dR--, dC--, index); //不断往中间靠拢
        }
        return result;
    }

    private void printMatrix(int[][] matrix, int tR, int tC, int dR, int dC, int index) {
        if (tR == dR) {
            //只有一行的情况
            for (int i = dR; i <= dC; i++) {
                result.add(matrix[tR][i]);
            }
        } else if (tC == dC) {
            //只有一列的情况
            for (int i = tR; i <= dR; i++) {
                result.add(matrix[i][tC]);
            }
        } else {
            //遵守矩阵打印规则
            int curR = tR;
            int curC = tC;
            while (curC != dC) {
                result.add(matrix[curR][curC]);
                curC++;
            }
            while (curR != dR) {
                result.add(matrix[curR][curC]);
                curR++;
            }
            while (curC != tC) {
                result.add(matrix[curR][curC]);
                curC--;
            }
            while (curR != tR) {
                result.add(matrix[curR][curC]);
                curR--;
            }
        }

    }

扑克牌顺子

题目

现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:

  1. A为1,J为11,Q为12,K为13,A不能视为14
  2. 大、小王为 0,0可以看作任意牌
  3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
    4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]

要求:空间复杂度 O(1),时间复杂度 O(nlogn),本题也有时间复杂度 O(n) 的解法;
牛客题目链接

思路

根据题目,我们可以分析出顺子需要满足以下两个条件:

  1. 顺子中的非零牌最大数和最小数相差不超过4;
  2. 顺子中的非零牌不能有重复数字;
    对于重复数字判断,我们可以采用HashMap进行处理;
代码实现
public boolean IsContinuous (int[] numbers) {
        HashMap<Integer,Integer> hashMap = new HashMap<>();
        //定义最大值和最小值
        int max = 0;
        int min = 13;
        for(int i = 0; i < numbers.length;i++){
            if(numbers[i] > 0 ){
            	//用于判断是否重复
                if(hashMap.get(numbers[i])!=null){
                    return false;
                }else{
                    hashMap.put(numbers[i],i);
                    //找出最大值和最小值
                    if(numbers[i] > max){
                        max = numbers[i];
                    }
                    if(numbers[i] < min){
                        min = numbers[i];
                    }
                }
            }
        }
        //计算相差,如果大于4则不满足顺子要求
        if(max - min > 4){
            return false;
        }
        return true;
    }

把字符串转换成整数

题目

描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 数字,字母,符号,空格组成的字符串表达式
4. 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
4.去掉无用的后导空格;
牛客题目链接

思路

按照转换要求一步步处理;

  1. 首先遍历过滤掉前面的空格;
  2. 判断当前字符是否为"+“或”-",用于记录数据的正负值,记得移动下标;
  3. 遍历获取每个字符对应的数字累加,并且过程中需要判断是否满足在32 位有符号整数范围内;
  4. 返回最终结果;
代码实现
public int StrToInt (String s) {
        int len = s.length();
        if(len == 0){
            return 0;
        }
        int sign = 1;
        long num = 0;
        int i = 0;
        //先跳过若干个空格
        while( i < len && s.charAt(i)== ' '){
            i++;
        }
        //判断第一位符号位是正数还是负数
        if(i < len){
            if(s.charAt(i) == '-'){
                sign = -1;
                i++;
            }else if(s.charAt(i) == '+'){
                i++;
            }
        }
        //取出数字部分,判断大小是否越界以及计算结果
        while(i < len){
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                int temp = s.charAt(i) - '0';
                num = num * 10 + temp;
                if(sign == 1 && num > Integer.MAX_VALUE){
                    return Integer.MAX_VALUE;
                }else if(sign == -1 && -num < Integer.MIN_VALUE){
                    return Integer.MIN_VALUE;
                }
                i++;
            } else{
                break;
            }
        }
        if(sign == 1){
            return (int)num;
        }else{
            return (int)-num;
        }

表示数值的字符串

题目

描述
请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。

科学计数法的数字(按顺序)可以分成以下几个部分:
1.若干空格
2.一个整数或者小数
3.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个整数(可正可负)
4.若干空格

小数(按顺序)可以分成以下几个部分:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 可能是以下描述格式之一:
3.1 至少一位数字,后面跟着一个点 ‘.’
3.2 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
3.3 一个点 ‘.’ ,后面跟着至少一位数字
4.若干空格

整数(按顺序)可以分成以下几个部分:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 至少一位数字
4.若干空格

例如,字符串[“+100”,“5e2”,“-123”,“3.1416”,“-1E-16”]都表示数值。
但是[“12e”,“1a3.14”,“1.2.3”,“±5”,“12e+4.3”]都不是数值。
牛客题目链接

思路

不需要思路,就是一堆判断直接干,静下心,耐住性子就可以搞定;

代码实现

自由发挥

public boolean isNumeric (String str) {
        if (str == null || str.length() == 0) {
            return false;
        }
        //去除字符串中的所有空格
        String res = str.replaceAll(" ", "");
        if (res.length() == 0) {
            return false;
        }
         if (res.contains("e") || res.contains("E")) {
            //当前可能是科学计数法
            return isENum(res);
        } else if (res.contains(".")) {
            //当前可能是小数
            return isNodeNum(res);
        } else {
            //当前可能是整数
            return isCommonNum(res);
        }
    }

    private boolean isENum(String res) {
        if (res == null || res.length() == 0) {
            return false;
        }
        res = res.toUpperCase();
        if (res.charAt(res.length() - 1) == 'E') {
            return false;
        }
        String[] split = res.split("E");
        if (split.length != 2) {
            return false;
        }
        return (isCommonNum(split[0])  || isNodeNum(split[0])) &&
               (isCommonNum(split[1]));

    }


    private boolean isCommonNum(String res) {
        if (res == null || res.length() == 0) {
            return false;
        }
        if (res.charAt(0) == '+' || res.charAt(0) == '-') {
            res  = res.substring(1, res.length());
        }
        if (res.length() == 0) {
            return false;
        }
        for (int i = 0 ; i < res.length(); i++) {
            if (res.charAt(i) < '0' || res.charAt(i) > '9') {
                return false;
            }
        }
        return true;
    }

    private boolean isNodeNum(String res) {
        if (res == null || res.length() == 0 || ".".equals(res)) {
            return false;
        }
        int nodeNum = 0;
        for (int i = 0 ; i < res.length(); i++) {
            if (res.charAt(i) == '.') {
                if (nodeNum == 1) {
                    return false;
                } else {
                    nodeNum++;
                }
            }
        }
        String[] split = res.split("\\.");
        if (split.length == 1) {
            return (isCommonNum(split[0]) || "".equals(split[0]));
        }
        boolean isSign = "".equals(split[0]) || "+".equals(split[0]) || "-".equals(split[0]);
        return (isCommonNum(split[0]) || isSign) &&
               (isCommonNum(split[1]) || "".equals(split[1]));
    }

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

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

相关文章

网站防盗链是什么

随着互联网的快速发展&#xff0c;网站的安全问题越来越受到关注。其中&#xff0c;防盗链是许多网站面临的一个重要问题。本文将介绍网站防盗链的基本概念、原因以及如何采取措施进行保护。 一、什么是网站防盗链&#xff1f; 网站防盗链是指未经授权的网站通过技术手段获取…

95基于matlab的多目标优化算法NSGA3

基于matlab的多目标优化算法NSGA3&#xff0c;动态输出优化过程&#xff0c;得到最终的多目标优化结果。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 95matlab多目标优化 (xiaohongshu.com)

mybatis的数据库连接池

直接看原文 原文链接:【MyBatis】 连接池技术_mybatis自带连接池-CSDN博客 本文先不说springBoot整合mybatis后的 本文讲的是没有被springBoot整合前的mybatis自己的默认的连接池 --------------------------------------------------------------------------------------…

三季度付费用户持续增加,知乎的“吸引力法则”是什么?

在过去的12年里&#xff0c;知乎一直是一个问答社区&#xff0c;通过“一问多答”形成了可以进行专业讨论的社区氛围&#xff0c;并累计完成了上亿次这样的专业讨论&#xff0c;同时还借助平台一问多答的形式打造了网文社区&#xff0c;依托于平台专业职场人的资源池打造了职业…

手写VUE后台管理系统8 - 配置404NotFound路由

设置404页面 配置路由404页面 配置路由 这里配置了两个路由&#xff0c;一个是主页&#xff0c;另外一个则匹配任意路由显示为404页面。因为只配置了两个路由&#xff0c;如果路径没有匹配到主页&#xff0c;则会被自动导向到404页面&#xff0c;这样就可以实现整站统一的404页…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念&#xff0c;最早提出的时间是在2014年左右&#xff0c;随后一直处于上升期&#xff0c;随着前两年阿里、腾讯的相继入场&#xff0c;竞争逐步加大。低代…

Redis 之 ZSET 实战应用场景,持续更新!

前言 大白话介绍 Redis 五大基本数据类型之一的 ZSET 开发中常见的应用场景 ZSET 介绍 ZSET 与 SET 相同点&#xff1a;都是是 String类型元素的集合&#xff0c;且不允许重复的成员ZSET 与 SET 不同点&#xff1a;ZSET 每个元素都会关联一个 Double 类型的分数&#xff0c;Re…

用python删除指定目录下带某个字符串的图片

前言&#xff1a; 在文件处理中&#xff0c;有时我们需要批量删除指定文件夹中的特定类型文件。如果文件数量非常庞大&#xff0c;手动删除会非常麻烦&#xff0c;所有可以用 Python 编写一个简单而高效的脚本&#xff0c;自动执行重复性的任务&#xff0c;从而节省时间和精力&…

@Scheduled,Quartz,XXL-JOB三种定时任务总结

Scheduled&#xff0c;Quartz&#xff0c;XXL-JOB三种定时任务总结 一、Scheduled 简介 Scheduled 是 Spring 框架中用于声明定时任务的注解。通过使用 Scheduled 注解&#xff0c;你可以指定一个方法应该在何时执行&#xff0c;无需依赖外部的调度器。 这个注解通常与Enab…

避免20种常见Selenium自动化测试异常,让你的测试更加稳定和可靠!

常见的Selenium异常 以下是所有Selenium WebDriver代码中可能发生的一些常见Selenium异常。 1、ElementClickInterceptedException 由于以某种方式隐藏了接收到click命令的元素&#xff0c;因此无法正确执行Element Click命令。 2、ElementNotInteractableException 即使目…

分清社保、医保、新农合

社保中的大头是养老保险&#xff0c;从上图可知成都每个月最低849.2元&#xff0c;对于底层人民来说价格不菲&#xff0c;但对应的医保才107元&#xff0c;那么能不能只交医保呢&#xff1f; 分三种情况&#xff1a; 1、如果我们购买的是城镇职工医疗保险&#xff0c;公司买的也…

vivado实现分析与收敛技巧9-分析使用率统计数据

实现问题的常见原因之一是未考量显式和隐式物理约束。例如 &#xff0c; 管脚分配 (pinout) 在逻辑布局上变为显式物理约束。 slice&#xff08; 分片 &#xff09; 逻辑在大部分器件中都是一致的。但如下专用资源表示的是隐式物理约束 &#xff0c; 因为这些资源仅在某些位置…

GCN,GraphSAGE 到底在训练什么呢?

根据DGL 来做的&#xff0c;按照DGL 实现来讲述 1. GCN Cora 训练代码&#xff1a; import osos.environ["DGLBACKEND"] "pytorch" import dgl import dgl.data import torch import torch.nn as nn import torch.nn.functional as F from dgl.nn.pytorc…

UVM验证环境 加入env

&#xff08;1&#xff09; 如何在UVM验证环境中例化reference model、scoreboard 如何在在验证平台中加入reference model、scoreboard&#xff0c;这个问题的解决方案是引入一个容器类&#xff0c;在这个容器类中实例化driver、monitor、reference model和scoreboard等。在…

Python 自动化办公:文件快速整理分类

平时桌面或文件夹内鱼龙混杂&#xff0c;各种类型的文件都有怎么办&#xff1f; 本篇文章中&#xff0c;我们将学习如何使用 Python 编写一个文件整理分类的脚本。 该脚本能够自动获取文件类型&#xff0c;并将文件按照类型整理到不同的子文件夹中。 先看下效果&#xff0c;…

新的 BLUFFS 攻击导致蓝牙连接不再私密

蓝牙是一种连接我们设备的低功耗无线技术&#xff0c;有一个新的漏洞需要解决。 中间的攻击者可以使用新的 BLUFFS 攻击轻松窥探您的通信。 法国研究中心 EURECOM 的研究员 Daniele Antonioli 演示了六种新颖的攻击&#xff0c;这些攻击被定义为 BLUFFS&#xff08;蓝牙转发和…

渗透测试学习day4

文章目录 靶机&#xff1a;SequelTask1Task2Task3Task4Task5Task6Task7Task8 靶机&#xff1a;CrocodileTask1Task2Task3Task4Task5Task6Task7Task8Task9Task10 靶机&#xff1a;ResponderTask1Task2Task3Task4Task5Task6Task7Task8Task9Task10Task11 靶机&#xff1a;ThreeTas…

使用百度开发者平台处理语音朗读

--TIME --百度开发者中心-汇聚、开放、助力、共赢 --注册账号 -- 准备工作 准备工作 更新时间&#xff1a;2023-01-13 成为开发者 三步完成账号的基本注册与认证&#xff1a; STEP1&#xff1a;点击进入控制台&#xff0c;选择需要使用的AI服务项。若为未登录状态&#xf…

CleanMyMac X2024破解注册激活码

CleanMyMac X for Mac中文2024版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。 cleanmymac x个人认为X代表界面上的最大升级&#xff0c;功能方面有更多增加&#xff0c;与最新macOS系统更加兼容&#xff0c;流畅地与系统性…

MacBook Pro 安装Redis【超详细图解】

目录 一、使用brew安装Redis 二、查看安装及配置文件位置 三、启动Redis 3.1 查看redis服务进程 3.2 redis-cli连接redis服务 四、关闭Redis 因项目需要&#xff0c;顺便记录安装过程 一、使用brew安装Redis brew install redis 如图所示即为安装成功&#xff01; 二…