牛客剑指offer刷题其他算法篇

2023-12-05

构建乘积数组

题目

描述
给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B 的元素 B[i]=A[0] A[1] …*A[i-1] A[i+1] …*A[n-1](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。

数据范围:1≤n≤10 ,数组中元素满足 ∣val∣≤10

示例1
输入:
[1,2,3,4,5]
返回值:
[120,60,40,30,24]

示例2
输入:
[100,50]
返回值:
[50,100]
牛客题目链接

思路

采用双重for循环,外循环i倒序遍历数组,内循环j顺序遍历数组,内循环中当i!=j时,乘上当前A[j](除 A[i] 以外的全部元素的的乘积),同时每次内循环遍历一遍后,需要将临时数据重置,结果在外循环中存储;

代码实现
public int[] multiply (int[] A) {
        if(A == null || A.length < 2){
            return new int[0];
        }
        int[] res = new int[A.length];
        int sum = 0;
        for(int i = A.length - 1;i>=0;i--){
            sum = 1;
            for(int j = 0; j < A.length;j++){
                if(i != j){
                    sum *= A[j];
                }
            }
            res[i] = sum;
        }
        return res;
    }

第一个只出现一次的字符

题目

描述
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

数据范围:0≤n≤10000,且字符串只有字母组成。
要求:空间复杂度 O(n),时间复杂度 O(n)

示例1
输入:
“google”
返回值:
4

示例2
输入:
“aa”
返回值:
-1
牛客题目链接

思路

采用HashMap + 两次for循环处理,第一次for循环记录每个字符出现的次数,第二次for循环找出第一个出现一次的字符。

代码实现
public int FirstNotRepeatingChar (String str) {
        if(str == null){
            return -1;
        }
        HashMap<Character,Integer> hash = new HashMap();
        for(int i = 0; i<str.length();i++){
            char a = str.charAt(i);
           if(hash.containsKey(a)){
              hash.put(a,2);//没必要统计字符出现的次数,不要设置不为1即可。
           }else{
              hash.put(a,1);
           }
        }

        for(int i = 0; i < str.length();i++){
             char a = str.charAt(i);
             if(hash.get(a) == 1){
                return i;
             }
        }
        return -1;
        
    }

替换空格

题目

描述
请实现一个函数,将一个字符串s中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

数据范围:0≤len(s)≤1000 。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。

示例1
输入:
“We Are Happy”
返回值:
“We%20Are%20Happy”

示例2
输入:
" "
返回值:
“%20”
牛客题目链接

思路

直接for循环判断拼接;

代码实现
public String replaceSpace (String s) {
        if(s == null || s.length() == 0){
            return s;
        }
        StringBuilder res = new StringBuilder();
        for(int i = 0; i < s.length();i++){
            char c = s.charAt(i);
            if(' ' == c){
                res.append("%20");
            }else{
                res.append(c);
            }
        }
        return res.toString();
    }

调整数组顺序使奇数位于偶数前面(一)

题目

描述
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

数据范围:0≤n≤5000,数组中每个数的值 0≤val≤10000
要求:时间复杂度 O(n),空间复杂度 O(n)
进阶:时间复杂度 O(n/2),空间复杂度 O(1)

示例1
输入:
[1,2,3,4]
返回值:
[1,3,2,4]

示例2
输入:
[2,4,6,5,7]
返回值:
[5,7,2,4,6]

牛客链接地址

思路

采用双指针思路,一个指针用于记录奇数从前往后遍历,则结果数组前部分记录的都是奇数,一个指针用于记录偶数从后往前遍历,则结果数组后部分记录的都是偶数,直到都遍历完整个数组为止;

代码实现
 public  int[] reOrderArray(int[] array) {
        if (array == null || array.length == 0) {
            return array;
        }
        int[] res = new int[array.length];
        int l = 0;
        int li = l;
        int r = array.length - 1;
        int ri = r;
        while (l < array.length && r >= 0) {
            if (array[l] % 2 == 1) {
            	//当前是奇数
                res[li++] = array[l];
            }
            l++;
            if (array[r] % 2 == 0) {
            	//当前是偶数
                res[ri--] = array[r];
            }
            r--;
        }
        return res;
    }

数组中出现次数超过一半的数字

题目

描述
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)

输入描述:
保证数组输入非空,且保证有解

示例1
输入:
[1,2,3,2,2,2,5,4,2]
返回值:
2

示例2
输入:
[3,3,3,3,2,2,2]
返回值:
牛客题目链接

思路

使用哈希表统计数组中数字出现的次数,然后判断即可;

代码实现
 public int MoreThanHalfNum_Solution (int[] numbers) {
        HashMap<Integer,Integer> hash = new HashMap();
        for(int num : numbers){
            if(hash.containsKey(num)){
                hash.put(num,hash.get(num)+1);
            } else{
                hash.put(num,1);
            }
            if(hash.get(num) > numbers.length /2){
                return num;
            }
        }
        return numbers[0];

    }

整数中1出现的次数(从1到n整数中1出现的次数)

题目

描述
输入一个整数 n ,求 1~n 这 n 个整数的十进制表示中 1 出现的次数
例如, 1~13 中包含 1 的数字有 1 、 10 、 11 、 12 、 13 因此共出现 6 次

注意:11 这种情况算两次

数据范围: 1≤n≤30000
进阶:空间复杂度 O(1) ,时间复杂度 O(lognn)

示例1
输入:
13
返回值:
6

示例2
输入:
0
返回值:
0

思路

直接遍历每一个数字的每一位是否为1进行累加;

代码实现
 public int NumberOf1Between1AndN_Solution(int n) {
        int res = 0;
        for(int i = 1; i <= n;i++){
            for(int j = i;j>0;j=j/10){
                if(j % 10 == 1){
                    res++;
                }
            }
        }
        return res;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客剑指offer刷题其他算法篇 的相关文章

  • ABB CI858K01 3BSE018135R1 通讯接口

    ABB CI858K01 3BSE018135R1 通讯接口 产品详情 ABB CI858K01 3BSE018135R1的通讯接口有以下特点 多种通信接口 CI858K01接口模块可能支持多种通信接口 例如以太网 串口 CAN总线等 用于

随机推荐

  • E (1052) : DS树--带权路径和

    文章目录 一 题目描述 二 输入与输出 1 输入 2 输出 三 参考代码 一 题目描述 计算一棵二叉树的带权路径总和 即求赫夫曼树的带权路径和 已知一棵二叉树的叶子权值 该二叉树的带权路径和APL等于叶子权值乘以根节点到叶子的分支数 然后求
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • Java架构师技术为业务赋能

    目录 1 概论 2 天猫的难言之隐 3 如何拆解技术难点 三段论 4 天猫线的破局之道 双引擎回归测试框架 5 架构师的心理游戏 解决问题从转换思维开始 6 技术助力业务的两个方向 7 阿里新零售部门如何培养技术团队的业务知识 8 如何围绕
  • acwing算法提高之动态规划--数字三角形模型

    目录 1 基础知识 2 模板 3 工程化 1 基础知识 暂无 2 模板 暂无 3 工程化 题目1 摘花生 解题思路 DP 状态定义 f i j 从 1 1 走到 i j 所摘花生总和 状态转移 有 从上方走到 i j 有 f i 1 j w
  • 服务器入侵如何防护,业务被攻击如何处理,服务器安全防护方案

    服务器是算是家用电脑的一种使用方法 主机不在用户家中 需要远程使用 在目前互联网时代占用很重要的位置 当然生活中也是应用广泛 服务器比普通计算机运行更快 负载更高 价格更贵 很多娱乐 工作都需要依靠服务器来运行整个体系 因此服务器的安全防护
  • 十分钟带你看懂——Python测试框架之pytest最全讲

    pytest特短 pytest是一个非常成熟的全功能的Python测试框架 主要有以下几个特点 简单灵活 容易上手 支持参数化 能够支持简单的单元测试和复杂的功能测试 还可以用来做selenium appnium等自动化测试 接口自动化测试
  • Python安装步骤介绍

    本文将介绍Python安装的详细步骤如下 下载 python 安装 python 配置环境变量 安装时勾选配置环境变量的则无需此步骤 一 python下载 官网 Download Python Python org 根据电脑位数下载所需的版
  • ICS TRIPLEX T9110高级处理器模块

    ICS TRIPLEX T9110高级处理器模块是一款高性能的处理器模块 通常用于工业控制和自动化系统中 它采用最新的Intel芯片组技术 包括815E芯片组 具有以下特点 高性能 T9110模块通常配备高性能的处理器 能够处理复杂的控制算
  • Spring到底是如何解决循环依赖问题的?

    Spring作为当前使用最广泛的框架之一 其重要性不言而喻 所以充分理解Spring的底层实现原理对于咱们Java程序员来说至关重要 那么今天笔者就详细说说Spring框架中一个核心技术点 如何解决循环依赖问题 什么是循环依赖问题 Spri
  • node express 批量压缩图片

    场景 我是10万张图片 只压缩 png jpg jpeg 分批次压缩 因为压缩要内存限制 不能一次性压缩那么多 const fs require fs const path require path const images require
  • Redis——简单动态字符串(Simple Dynamic Strings,SDS)

    简单动态字符串 Simple Dynamic Strings SDS 是Redis的基本数据结构之一 用于存储字符串和整型数据 SDS兼容C语言标准字符串处理函数 且在此基础上保证了二进制安全 1 数据结构 在了解SDS源码前 我们先思考一
  • 移动端APP自动化测试框架-UiAutomator2基础

    很早以前 我用 uiautomator java实践过Android APP自动化测试 不过今天要提的不是uiautomator 而是uiautomator2 听起来uiautomator2像是uiautomator的升级版 但是这两款框架
  • BENTLY 3500/45 位置监测器

    BENTLY 3500 45 位置监测器 BENTLY 3500 45 位置监测器 产品详情 Bently 3500 45 位置监测器是一种四通道仪器 可以接收来自接近传感器 旋转位置传感器 RPT 直流线性可变差动变压器 DC LVDT
  • 光伏储能单相逆变器并网仿真模型(Simulink仿真实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Simulink仿真实现
  • 边缘计算网关构建智慧楼宇新生态,打造未来建筑管理

    边缘计算网关在无人值守环境中的应用十分广泛 尤其在智慧楼宇管理方面发挥着重要作用 它能够实现多个地点多楼宇之间的数据实时互通 通过边缘计算网关物联网应用构建智慧楼宇生态系统 解决传统楼宇管理网络布线 人员巡检以及后期运维等问题 在无人值守环
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成
  • 初级6 朋友间的问候

    对话场景 Whose shirt is that Is this your shirt Dave No sir It s not my shirt This is my shirt My shirt is blue Is this shir
  • 使用多窗口Savitzky-Golay(MWSG)滤波器增强频谱图,用于鲁棒的鸟鸣检测(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 基于改进Dropout的连续DBN无监督特征学习研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及数据
  • 牛客剑指offer刷题其他算法篇

    文章目录 构建乘积数组 题目 思路 代码实现 第一个只出现一次的字符