剑指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中的布隆过滤器攻略 一、什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一个空间效率非常高的数据结构,主要用于判断一个元素是否在集合中。它的基本思想是利用多个不同的哈希函数来判断元素是否在集合中,可以高效地检索这些元素,降低了查询时间和存储空间。 二、布隆过滤器的实现 2.1 对于一个数据结构,我们会使用哪些数据结构? 在Java中,我们…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“HttpMessageNotReadableException”的原因和处理方法

    原因 “HttpMessageNotReadableException” 错误通常是以下原因引起的: 请求体不正确:如果请求体不正确,则可能会出现此错误。在这种情况下,您需要检查请求体并确保它们正确。 请求体格式不正确:如果请求体格式不正确,则可能会出现此错误。在这种情况下,您需要检查请求体格式并确保它们正确。 解决办法 以下是解决 “HttpMessage…

    Java 2023年5月4日
    00
  • Java webSerivce的使用看完你就明白了

    下面是一个完整的攻略,帮助你了解和使用Java Web Service。 Java Web Service 的使用看完你就明白了 什么是 Java Web Service Java Web Service 是一种基于 XML 和 HTTP 协议的远程服务技术,它允许应用程序在不同操作系统、不同编程语言和不同的硬件平台上进行交互和通信。 Java Web Se…

    Java 2023年5月27日
    00
  • 简单分析Java的求值策略原理

    首先让我们来简单了解一下Java的求值策略原理。Java的求值策略分为两种,一种是短路求值策略,另一种是全部求值策略。 短路求值策略 短路求值策略是指当Java解释器求一个条件表达式的值时,如果根据前面的部分已经可以确定整个表达式的值,那么后面的部分将不再执行,即跳过后面的部分的求值过程。具体示例如下: a && b 在上述代码中,当a为fa…

    Java 2023年5月26日
    00
  • Spring利用注解整合Mybatis的方法详解

    对于“Spring利用注解整合Mybatis的方法详解”的攻略,我会进行以下步骤进行讲解: 1. 添加Mybatis和Spring的依赖 在项目的pom.xml中添加以下依赖: <!– Mybatis依赖 –> <dependency> <groupId>org.mybatis</groupId> <…

    Java 2023年5月20日
    00
  • 使用JAVA通过ARP欺骗类似P2P终结者实现数据封包监听

    首先需要明确的是,ARP欺骗是指通过伪造ARP响应的方式,诱导受害者将数据包发送至攻击者的电脑,从而实现数据封包监听、拦截等攻击行为。下面给出使用Java实现ARP欺骗的攻略过程。 1. 获取受害者电脑的MAC地址 要实现ARP欺骗的攻击,首先需要获取受害者电脑的MAC地址。可以通过以下代码实现: InetAddress address = InetAddr…

    Java 2023年6月15日
    00
  • Java8到Java19的一些变化分析详解

    Java8到Java19变化分析详解 随着Java版本的不断更新,Java8到Java19经历了多次重大变革,本文将针对这些变化进行详细讲解和分析。 Lambda表达式 Java8引入了Lambda表达式,这是Java8最具革命性的改变之一。Lambda表达式可以简化代码并使代码更具可读性。下面是一个示例说明: List<String> list…

    Java 2023年5月25日
    00
  • java String 类的一些理解 关于==、equals、null

    下面是关于Java String类的一些理解。 1. == 在Java中,== 表示引用的等价性,比较两个对象是否是同一个对象的引用。如果两个引用指向同一个对象,那么它们是等价的。例如: String str1 = "hello"; String str2 = "hello"; if (str1 == str2) { …

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