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

相关文章

  • .NET微信小程序用户数据的签名验证和解密代码

    首先,我们需要了解微信小程序中用户数据的签名和解密过程。当用户在小程序内使用“获取用户信息”API获取到用户信息时,此时微信服务器返回了三个值:encryptedData、iv和signature。其中,encryptedData是加密后的用户信息,iv是加密算法的初始向量,signature是对用户信息进行签名得到的一个值。 为了确保用户数据的安全性,我们…

    Java 2023年5月23日
    00
  • 解决java转义json出现\u0000 等乱码的问题

    解决Java转义JSON出现乱码的问题,在于正确地处理JSON字符串的Unicode字符编码方式和转义符。 问题分析 当我们使用Java将一个对象转化为JSON字符串时,如果对象中包含了Unicode字符,经过转义后在JSON字符串中就会出现”\uXXXX”的形式,其中XXXX是Unicode字符的十六进制编码。 然而,在有些情况下,这种转义是会导致乱码的。…

    Java 2023年5月20日
    00
  • Java获得一个数组的指定长度排列组合算法示例

    下面详细讲解一下Java获得一个数组的指定长度排列组合算法示例的完整攻略。 算法说明 在程序设计中,经常会遇到需要从给定的元素集合中去选取一些元素,这些元素能组成的各种可能长度的排列和组合集合。这时候,排列和组合问题就变得特别重要。在Java中,提供了一些工具类帮助我们解决这些问题。 排列和组合的定义 排列问题中,给定n个元素,从中选取k个元素进行排列,若n…

    Java 2023年5月26日
    00
  • Struts2访问Servlet的三种方式

    Struts2访问Servlet的三种方式 概述 在Struts2中,我们可以通过三种方式来访问Servlet。这三种方式分别是: 直接使用Servlet的请求 使用RequestDispatcher转发请求 使用redirect重定向请求 接下来,我们将简要介绍这三种方式,并提供代码示例来演示如何使用它们。 直接使用Servlet的请求 我们可以通过直接使…

    Java 2023年5月20日
    00
  • java实现随机数生成器

    生成随机数是我们在Java程序中经常遇到的问题,Java提供了一些内置的方法来生成伪随机数,我们也可以使用外部库来实现更高级别的随机化过程。本文将为大家介绍Java实现随机数生成器的完整攻略。 生成伪随机数 Java为我们提供了一些内置的类,比如Random和Math,来生成伪随机数。 使用Random类 Random类是Java中最基本的生成随机数的类之一…

    Java 2023年5月23日
    00
  • 25个最好的免费Eclipse插件

    下面是关于“25个最好的免费Eclipse插件”的详细讲解攻略。 插件分类 首先,我们需要了解一下这25个免费Eclipse插件的分类,它们主要分为以下五个类别: 代码质量类插件 测试类插件 编辑器增强类插件 版本控制类插件 其他常用插件 接下来,我们会依次详细解释每个插件的功能并提供使用示例。 1. 代码质量类插件 代码质量类插件主要用于提高代码的质量和可…

    Java 2023年5月19日
    00
  • SpringMVC配置与使用详细介绍

    以下是关于“SpringMVC配置与使用详细介绍”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用的Java Web开发框架,它可以帮助开发者快速构建Web应用程序。本攻略将详细讲解SpringMVC的配置与使用方法,帮助读者更好地掌握SpringMVC框架的使用方法。 2. SpringMVC的配置方法 以下是SpringMVC的配…

    Java 2023年5月16日
    00
  • 在IDEA中搭建最小可用SpringMVC项目(纯Java配置)

    以下是关于“在IDEA中搭建最小可用SpringMVC项目(纯Java配置)”的完整攻略,其中包含两个示例。 在IDEA中搭建最小可用SpringMVC项目(纯Java配置) Spring MVC是一个基于Java的Web框架,它可以帮我们快速开发Web应用程序。在IDEA中搭建最小可用SpringMVC项目非常简单,本文将介绍如何使用纯Java配置搭建最小…

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