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:
输入:[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