剑指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日

相关文章

  • Maven插件docker-maven-plugin的使用

    下面是关于” Maven插件docker-maven-plugin的使用”的完整攻略,包含了插件的介绍、使用方式和示例。 Maven插件docker-maven-plugin简介 docker-maven-plugin是一款Maven插件,它可以让你使用 Maven 来构建、运行和管理 Docker 镜像。它基于 Docker Java API 和 Dock…

    Java 2023年5月19日
    00
  • Struts2 使用OGNL遍历map方法详解

    Struts2 中遍历 Map 对象 首先,我们需要在 Struts2 的 jsp 页面中通过<s:iterator>标签来遍历 Map 类型的对象。这个标签包含了一个 value 属性,用于读取 map 中的值,具体如下: <s:iterator value="myMap"> Key: <s:propert…

    Java 2023年6月15日
    00
  • SpringBoot2.X Kotlin系列之数据校验和异常处理详解

    SpringBoot2.X Kotlin系列之数据校验和异常处理详解 概述 本文主要介绍在使用SpringBoot2.x和Kotlin进行Web开发时,如何实现数据校验和异常处理。我们将会使用@Valid注解进行数据校验,并使用ExceptionHandler来捕获异常并统一处理。 数据校验 SpringBoot2.x 数据校验注解 SpringBoot2.…

    Java 2023年5月19日
    00
  • springboot pojo对象日期属性的问题

    首先,要讲解SpringBoot POJO对象日期属性的问题,我们需要了解Java中日期类型的常见问题。Java中日期类型有多种,如java.util.Date、java.util.Calendar等,但是这些类型在处理过程中经常会出现时间格式转换错误等问题。因此Java8中新增了java.time.LocalDateTime和java.time.Local…

    Java 2023年5月26日
    00
  • java(jsp)整合discuz同步登录功能详解

    下面是详细讲解“java(jsp)整合discuz同步登录功能详解”的攻略。 介绍 Discuz是一个比较古老的论坛系统,它有很多的功能以及插件,而且也有很多网站在使用它。如果你已经有了一个成熟的Java Web网站,那么也许你希望这个网站能够跟Discuz集成起来,实现同步登录的功能。这篇攻略将介绍如何实现Java Web和Discuz之间的同步登录功能。…

    Java 2023年6月15日
    00
  • javaweb图书商城设计之订单模块(5)

    “javaweb图书商城设计之订单模块(5)”是讲解Java Web技术在图书商城的订单模块中的实际应用的文章。下面是完整攻略: 1. 了解订单模块的作用 订单模块是通过电子商务网站完成用户向商家购书的过程中对购买物品的确认、支付以及收货、退货等交易活动的模块。订单模块是整个网站的核心功能,好的订单管理可提供对整个业务环节的监管和管理,降低运营成本。 2. …

    Java 2023年6月15日
    00
  • java基础之方法和方法的重载详解

    Java基础之方法和方法的重载详解 方法是Java程序中最基本的组成部分之一。“方法”的英文名为“Method”,也可以被称为“函数(Function)”或者“子程序(Subroutine)”。方法装有的代码块可以被多次调用,使得程序模块化,更加易于理解、调试和维护。 什么是Java方法? Java方法是一组相关语句的集合,能够一次性执行多个语句。方法是一种…

    Java 2023年5月26日
    00
  • Java实现统计文档中关键字出现的次数

    为了实现统计文档中关键字出现的次数,我们需要以下步骤: 步骤一:获取文档内容 首先,我们需要读取文档中的内容,可以使用Java中的File类来进行文件的读取,示例代码如下: File file = new File("example.txt"); try { BufferedReader br = new BufferedReader(n…

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