Java每日一练(20230513) 输出最值、盛水容器、旋转数组II

简介: Java每日一练(20230513) 输出最值、盛水容器、旋转数组II

1. 输出最值


编写一个字符界面的Java Application 程序,接受用户输入的10个整数,并输出这10个整数的最大值和最小值。


出处:

https://edu.csdn.net/practice/27729476

代码:

import java.util.Scanner;
public class MaxMin {
    public static void main(String[] args) {
        Arrays array = new Arrays();
        array.setArr();
        int max=array.getMax();
        int min=array.getMin();
        System.out.println("数组中最大值="+max);
        System.out.println("数组中最小值="+min);
    }
}
class Arrays {
    private int[] arr;
    public Arrays() {
        arr = new int[10] ;
        for(int i = 0; i<arr.length;i++) {
            arr[i] =0;
        }
    }
    public void setArr() {
        Scanner sc = new Scanner(System.in);  
        System.out.println("请输入数组元素的值:");  
        arr = new int[10] ;
        for(int i = 0; i<arr.length;i++) {
            arr[i] = sc.nextInt();
        }
    }
    public int getMax() {
        int max = arr[0];
        for(int i : arr) {
            if(max < i)
                max = i;
        }
        return max; 
    }
    public int getMin() {
        int min= arr[0];
        for(int i : arr) {
            if(min > i)
                min= i;
        }
        return min; 
    }
}


输出:




2. 盛最多水的容器


给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。


说明:你不能倾斜容器。


示例 1:

68b73af992268f52fa1d1edf7891fcc2.jpeg


输入:[1,8,6,2,5,4,8,3,7]

输出:49  

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。


示例 2:

输入:height = [1,1]

输出:1


示例 3:

输入:height = [4,3,2,1,4]

输出:16


示例 4:

输入:height = [1,2,1]

输出:2


提示:

   n = height.length

   2 <= n <= 3 * 10^4

   0 <= height[i] <= 3 * 10^4

出处:

https://edu.csdn.net/practice/27729477

代码:

import java.util.*;
public class Solution {
    public static int maxArea(int[] height) {
        int N = height.length;
        int i = 0;
        int j = N - 1;
        int max = 0;
        while (i < j) {
            int c = (j - i) * Math.min(height[i], height[j]);
            if (c > max) {
                max = c;
            }
            if (height[i] > height[j]) {
                j--;
            } else {
                i++;
            }
        }
        return max;
    }
    public static void main(String[] args) {
        int[] height = {1,8,6,2,5,4,8,3,7};
        System.out.println(maxArea(height));
        int[] height2 = {1,1};
        System.out.println(maxArea(height2));
        int[] height3 = {4,3,2,1,4};
        System.out.println(maxArea(height3));
        int[] height4 = {1,2,1};
        System.out.println(maxArea(height4));
    }
}

输出:

49

1

16

2


3. 搜索旋转排序数组 II


已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。


在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4] 。


给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。


示例 1:

输入:nums = [2,5,6,0,0,1,2], target = 0

输出:true


示例 2:

输入:nums = [2,5,6,0,0,1,2], target = 3

输出:false


提示:

   1 <= nums.length <= 5000

   -10^4 <= nums[i] <= 10^4

   题目数据保证 nums 在预先未知的某个下标上进行了旋转

   -10^4 <= target <= 10^4


进阶:

   这是 搜索旋转排序数组 的延伸题目,本题中的 nums  可能包含重复元素。

   这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?


出处:

https://edu.csdn.net/practice/27729478

代码:

import java.util.*;
public class Solution {
    public static boolean search(int[] nums, int target) {
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            while (low < high && nums[low] == nums[low + 1]) {
                low++;
            }
            while (low < high && nums[high] == nums[high - 1]) {
                high--;
            }
            int mid = (low + high) / 2;
            if (nums[mid] == target) {
                return true;
            }
            if (nums[mid] >= nums[0] && (target > nums[mid] || target < nums[0])) {
                low = mid + 1;
            } else if (nums[mid] < nums[0] && target > nums[mid] && target < nums[0]) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        int[] nums = {2,5,6,0,0,1,2};
        System.out.println(search(nums, 0));
        System.out.println(search(nums, 3));
    }
}



输出:

true

false

目录
相关文章
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
3月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
39 4
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
47 2
|
3月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
106 2
|
3月前
|
存储 Java
什么是带有示例的 Java 中的交错数组?
什么是带有示例的 Java 中的交错数组?
61 9
|
3月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
30 3
|
3月前
|
存储 Java 程序员
【一步一步了解Java系列】:何为数组,何为引用类型
【一步一步了解Java系列】:何为数组,何为引用类型
38 1
|
3月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
42 0
|
11天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
13天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。