剑指Offer之Java算法习题精讲数组与字符和等差数列

剑指Offer之Java算法习题精讲数组与字符和等差数列

剑指Offer面试题中,数组和等差数列相关的算法习题十分常见,该攻略将针对这些习题进行详细的讲解。

数组

在Java中,数组是一种非常基础的数据类型,它可以存储一组具有相同类型的数据。数组的下标从0开始,可以使用array[index]的方式获取数组中特定下标的元素。下面讲解两道涉及数组的算法题:

1. 在排序数组中查找数字

题目描述:

在一个排序数组中查找数字,统计某个数字在排序数组中出现的次数。

示例1:

输入:[1, 2, 3, 3, 3, 4, 5], 3

输出:3

解释:数字3在数组中出现了3次。

思路:

由于数组是排序的,因此可以使用二分查找的方式来查找数字。具体来说,我们可以先利用二分查找找到某个数字出现的第一个位置和最后一个位置,然后根据这两个位置的差值求出该数字在数组中出现的次数。

代码实现:

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int first = binarySearch(array, k);
        int last = binarySearch(array, k + 1);
        return (first == array.length || array[first] != k) ? 0 : last - first;
    }

    private int binarySearch(int[] array, int target){
        int left = 0, right = array.length;
        while(left < right){
            int mid = (left + right) / 2;
            if(array[mid] >= target) right = mid;
            else left = mid + 1;
        }
        return left;
    }
}

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

题目描述:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

示例1:

输入:[1, 2, 3, 2, 2,2, 5, 4, 2], 3

输出:2

解释:数字2在数组中出现了5次,占数组长度的一半以上。

思路:

由于该数字出现的次数超过数组长度的一半,因此可以使用摩尔投票法来查找该数字,具体步骤如下:

  1. 初始化候选数字为数组的第一个数字,计数器为1;
  2. 从第二个数字开始遍历数组,遇到相同的数字则计数器加1,否则计数器减1;
  3. 如果计数器减至0,则更新候选数字为当前的数字,并将计数器置为1;
  4. 遍历完成后,得到的候选数字就是出现次数超过一半的数字。

代码实现:

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        int count = 0, candidate = 0;
        for(int num : array){
            if(count == 0) candidate = num;
            if(num == candidate) count++;
            else count--;
        }
        int cnt = 0;
        for(int num : array){
            if(num == candidate) cnt++;
        }
        return cnt > array.length / 2 ? candidate : 0;
    }
}

等差数列

在数学中,等差数列是指一组数之间差值相等的数列。在Java中,可以使用for循环等控制结构来处理等差数列的问题。下面讲解一道关于等差数列的算法题:

1. 请你设计一个收银程序

题目描述:

设计一个收银程序,要求输入商品数量和单价,并计算出总价。如果商品数量大于等于3个,则会进行折扣,折扣的价格就是数量为3的商品单价的一半。

示例1:

输入:3 10.0

输出:27.5

解释:商品数量为3,单价为10.0,折扣价格为5.0,因此总价为(10.0 + 10.0 + 10.0 / 2) = 27.5

思路:

首先需要读取输入数据,可以使用Scanner类来实现。然后根据商品数量来计算折扣价格和总价。最后输出结果就可以了。

代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double p = sc.nextDouble();
        double price = n * p;
        if(n >= 3) price -= p / 2;
        System.out.printf("%.1f", price);
    }
}

以上就是本次攻略的内容,通过对数组和等差数列相关算法的讲解,希望能够对大家进行帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:剑指Offer之Java算法习题精讲数组与字符和等差数列 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java 实战图书管理系统的实现流程

    Java 实战图书管理系统实现流程 本文将给出一个详细的Java 实战图书管理系统实现流程。我们将按照以下五步走进行: 1. 规划 首先我们需要规划我们的图书管理系统将包含哪些功能,这样我们才能更好的开始开发我们的应用程序。我们的规划包括以下几点: 实现基本的图书信息管理功能 包括添加、修改、删除、查询等功能 图书信息应该能方便地导出为Excel文件 实现图…

    Java 2023年5月24日
    00
  • 浅谈java对象之间相互转化的多种方式

    浅谈Java对象之间相互转化的多种方式 在Java编程中,对象之间的相互转换是非常常见的操作。本文将介绍一些Java对象之间相互转换的多种方式。 1.使用构造函数进行对象转换 Java的构造函数是一种用于创建和初始化对象的特殊方法。构造函数可以使用另一个对象来初始化一个新的对象。下面是一个使用构造函数进行对象转换的示例代码: public class Per…

    Java 2023年5月26日
    00
  • SpringBoot中web模板渲染的实现

    Spring Boot中Web模板渲染的实现 1. 什么是Web模板渲染? Web模板渲染是指将动态数据和静态模板文件结合起来,生成最终的HTML页面的过程。在Spring Boot中,我们可以使用多种模板引擎来实现Web模板渲染,例如Thymeleaf、FreeMarker、Velocity等。 2. Spring Boot中Web模板渲染的实现 在Spr…

    Java 2023年5月18日
    00
  • Java 将字符串动态生成字节码的实现方法

    Java提供了内置的动态生成字节码的API——java.lang.invoke.MethodHandles.Lookup,该API可以通过反射调用Java虚拟机的动态字节码生成引擎,用于在运行时生成并加载字节码。本攻略将详细讲解使用该API动态生成字节码的完整过程。 1. 创建一个类加载器 在Java中,每个类都必须通过类加载器进行加载才能被JVM识别并执行…

    Java 2023年5月27日
    00
  • spring boot 与kafka集成的示例代码

    下面就给您讲解Spring Boot与Kafka集成的示例代码攻略。 1. 引入依赖 首先,在pom.xml文件中添加Kafka相关的依赖: <!–kafka–> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId…

    Java 2023年5月20日
    00
  • Serv-U 8.0 服务器中文乱码问题的解决

    这里是 Serv-U 8.0 服务器中文乱码问题的解决攻略。 问题描述 在 Serv-U 8.0 服务器中,当有中文字符传输时,会出现乱码问题,影响文件传输的正常使用。 解决方案 方案一:修改 Serv-U 的默认编码格式 Serv-U 8.0 服务器默认采用 ISO-8859-1 编码格式,而中文字符需要使用 UTF-8 编码格式才能正确显示。因此,我们需…

    Java 2023年5月20日
    00
  • 详解使用Jenkins自动编译部署web应用

    详解使用Jenkins自动编译部署web应用 简介 Jenkins是一个开源的、支持持续集成和持续交付的软件开发工具。使用Jenkins可以编译、打包、测试和部署你的web应用程序。本文将详细讲解如何使用Jenkins自动编译部署web应用。 环境配置 在开始使用Jenkins自动编译部署web应用之前,需要进行一些环境配置。以下是环境配置的步骤: 安装Je…

    Java 2023年5月26日
    00
  • Java关于数组的介绍与使用

    Java关于数组的介绍与使用 数组是一组数据的集合,是Java中的一种基本的数据结构类型,具有以下特点: 数组是一种固定大小,且元素类型相同的数据结构; 数组的下标从0开始; 数组在创建时需要指定长度,且长度不可改变; 数组可以存储基本类型和引用类型。 声明和初始化数组 声明数组的语法格式如下: dataType[] arrayName;//推荐 或 dat…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部