Arrays工具、二维数组以及LeetCode练习题
1 Arrays
PS:Arrays位于java.util包下
int binarySearch(type[] a, type key);
使用二分法查询 key 元素在 a 数组中的索引,如果数组不包含这个值,则返回负数。使用前要求这个数组是升序排列,才能得到正确结果。
int binarySearch(type[] a, int fromIndex, int toIndex, type key);
和上面类似,但是只从 fromIndex 到 toIndex 范围内找元素,一样要求数组是升序的。
type[] copyOf(type[] originla , int length);
复制一个数组,length 是新数组的长度。如果 length 小于原数组,则只复制前length长度的值;如果大于原数组,后面补0、false、null。
type[] copyOf(type[] originla , int from, int to);
与前面类似,但是只复制规定范围内的元素。
boolean equals(type[] a1 , type[] a2)
如果 a1 和 a2 长度相等且元素相同,则返回 true,否则返回false。
void fill(type[] a , type val)
该方法会把 a 数组的所有元素都赋值为val的值。
void fill(type[] , int fromIndex , int toIndex, type val)
与上方法类似,规定了范围。
void sort(type[] a)
该方法对 a 数组的元素进行升序排列。特别的是,如果 a 是字符串数组,则按照字符串长度的升序排列。
void sort(type[] a , int fromIndex int toIndex)
类似,仅对范围内排序。
String toString(type[] a)
将一个数组转换成一个字符串,该方法按顺序把多个数组元素连成一个字符串,用逗号和空格分隔每个元素,外面用 '[' 、']'括起来。
2 Java 8 之后 Arrays 增强功能
下面方法中,parallel 代表可以用多 cpu 提高性能,xxx 或 Xxx 代表数据类型,比如int,double
void parallelPrefix(xxx[] array, XxxBinaryOperator op)
void parallelPrefix(xxx[] array , int fromIndex , toIndex , XxxBinaryOperator op)
该方法使用 op 参数指定的计算公式计算得到的结果作为新的数组元素。op 计算公式包括 left 、 right 两个形参,其中 left 代表新数组中钱一个前一个索引处的元素,right 代表 array 数组中当前索引处的元素。新数组的第一个元素无须计算,直接等于 array数组的第一个元素。
void setAll(xxx[] array , IntToXxxFunction generator)
该方法用指定的生成器为所有数组元素设置值,该生成器控制数组元素的值的生成算法。
void parallelSetAll(xxx[] array , IntToXxxFunction generator)
与上方法类似,增加了并行能力,利用多 cpu 提升性能
void parallelSort (xxx[] a)
void parallelSort (xxx[] a , int fromIndex , int toIndex)
与之前Arrays里面的sort方法类似,增加了并行能力,可以利用多 cpu 提高性能。
增强功能的程序示例:
import java.util.Arrays;
import java.util.function.IntBinaryOperator;
import java.util.function.IntUnaryOperator;
public class ArraysTest {
public static void main(String[] args) {
int[] array1 = new int[] {3, -4, 25, 16, 30, 18};
//用Arrays类的方法排序
Arrays.parallelSort(array1);
System.out.println(Arrays.toString(array1));
int[] array2 = new int[] {3, -4, 25, 16, 30, 18};
//前一个索引的元素乘以当前元素得到新数组,需要import java.util.function.IntBinaryOperator
Arrays.parallelPrefix(array2, new IntBinaryOperator() {
public int applyAsInt(int left , int right) {
return left * right;
}
});
System.out.println(Arrays.toString(array2));
int array3[] = new int[5];
//使用当前索引*5的方法生成元素,需要import java.util.function.IntUnaryOperator
Arrays.parallelSetAll(array3, new IntUnaryOperator() {
//operand 是当前索引
public int applyAsInt(int operand) {
return operand * 5;
}
});
System.out.println(Arrays.toString(array3));
}
}
输出结果:

3 二维数组
3.1 二维数组原理
因为数组元素可以是引用类型,所以可以让数组作为数组的元素,这样就产生了二维数组。java 中二维数组不要求是矩阵形式。
3.2 定义二维数组
type[][] arrayName;
其实质还是一维数组,只是数组的元素也是引用。
3.3 初始化
arrayName = new type[length][]
这里相当于定义了 length 个type[]类型的变量。接下来继续初始化
arrayName[0] = new type[2]
这里把一个长度为2的数组赋给前面定义的一维数组的第一个元素,此时arrayName[0][0]和arrayName[0][1]的值都是0(如果type是 int 的时候),一维数组的其它元素都是null;
一个初始化好的二维数组在内存中的示意图:

3.4 常用初始化方法
- 同时定义二维数组的两个维数(矩形数组)
int[][] arrayName = new int[3][4]
- 显示定义(静态)二维数组(不一定是矩形)
int [][] a = {{1,2},{3,4,0,9},{5,6,7}};
或者
String[][] str1 = new String[][]{new String[3] , new String[]{"Hello"}}
简化版
String[][] str2 = {new String[3] , new String[]{"Hello"}};
4 LeetCode 练习
13.罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
- I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
解题思路:
遵循一个逻辑,如果某个字符代表的值大于等于它的下一个字符代表的值,则是“加”;如果小于它的下一个字符代表的值,则是“减”。注意最后一个字符没有“下一个”,一定是加。
源码:
class Solution {
public int romanToInt(String s) {
char[] ch = s.toCharArray();
int result = 0;
for(int i = 0; i < ch.length; i++){
if(i == ch.length - 1){
result += getNum(ch[i]);
}else if (getNum(ch[i]) >= getNum(ch[i+1])){
result += getNum(ch[i]);
}else{
result -= getNum(ch[i]);
}
}
return result;
}
public static int getNum(char tmp){
switch(tmp){
case 'M':
return 1000;
case 'D':
return 500;
case 'C':
return 100;
case 'L':
return 50;
case 'X':
return 10;
case 'V':
return 5;
case 'I':
return 1;
}
return 0;
}
}
14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
源码:
class Solution {
public String longestCommonPrefix(String[] strs) {
String commonPrefix = "";
int length = ~0>>>1;
if(strs.length == 0)
return commonPrefix;
for (int i = 0; i < strs.length; i++){
if(strs[i].length() < length)
length = strs[i].length();
}//求出最短字符长度
/*可用这种方法求最短长度
Arrays.sort(strs);//按长度排列
int len=Math.min(strs[0].length(),strs[strs.length-1].length());
*/
HashMap<Integer , Character> map = new HashMap<Integer , Character>();
for(int i = 0; i < strs[0].length();i++){
map.put(i , strs[0].charAt(i));
}//将第一个字符串每个字符加入hashmap
outer:
for(int i =0; i < length; i++){
for(int j = 0; j < strs.length; j++){
if(map.get(i) == strs[j].charAt(i)){}
else{
break outer;
}//如果和该位置字符不匹配则退出循环
}//每完成一次循环将该位置字符加到结果上
commonPrefix += strs[0].charAt(i);
}
return commonPrefix;
}
}
Arrays工具、二维数组以及LeetCode练习题的更多相关文章
- Arrays类的运用,二分法,数组的复制,命令行参数的运用,二维数组,Object,equals
/*Arrays jdk中为了便于开发,给开发者提供了Arrays类, 其中包含了很多数组的常用操作.例如快速输出.排序.查找等.*/ import java.util.Arrays; public ...
- 二维数组及Arrays工具类
1.二维数组 概念: 数组中的每一个元素类型都是一维数组 二维数组初始化方式: 静态初始化: 格式: 元素类型[][] 数组名 = new 元素类型[][]{{一维数组1},{一维数组2},{一维数组 ...
- 数组属性的习题、Arrays工具、二维数组
一.数组的练习 1.声明一个char类型的数组, 从键盘录入6个字符: [1]遍历输出 [2]排序 [3]把char数组转化成一个逆序的数组. import java.util.Scanner; pu ...
- java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象
1. java.util.Arrays 数组工具类 Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...
- 静态方法,Arrays类,二维数组
一.静态方法 静态方法属于类的,可以直接使用类名.方法名()调用. 静态方法的声明 访问修饰符 static 类型 方法名(参数列表) { //方法体 } 方法的作用:一个程序分解成几个方法,有利于快 ...
- 常用的Arrays类和二维数组以及二分法的介绍
---恢复内容开始--- 1.Array类 Array中包含了许多数组的常用操作,较为常见的有: (1)快速输出 import java.util.Arrays; public class Test{ ...
- 首先定义一个5X8的二维数组,然后使用随机数填充满。借助Arrays的方法对二维数组进行排序。
package day02; import java.util.Arrays; import java.util.Random; public class Test01 { public static ...
- [leetcode]48RotateImage二维数组翻转
import java.util.Arrays; /** * You are given an n x n 2D matrix representing an image. Rotate the im ...
- LeetCode二维数组中的查找
LeetCode 二维数组中的查找 题目描述 在一个 n*m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增.请完成一个搞笑的函数,输入这样的一个二维数组和一个整数,判断数 ...
随机推荐
- tomcat7支持https配置
基本环境:centos7.0 jdk1.8 tomcat7 1.下载tomcat,解压到指定目录 例如:/home/test/apache-tomcat-7.0.81 2.生成证书 首先进入J ...
- 页面性能优化-原生JS实现图片懒加载
在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再 ...
- [Android]自己动手做个拼图游戏
目标 在做这个游戏之前,我们先定一些小目标列出来,一个一个的解决,这样,一个小游戏就不知不觉的完成啦.我们的目标如下: 游戏全屏,将图片拉伸成屏幕大小,并将其切成若干块. 将拼图块随机打乱,并保证其能 ...
- Python集成开发环境
目录 为什么用IDE(了解) Pycharm(掌握) Jupyter(掌握) 为什么用IDE(了解) 到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件.写完保存时还要选择存放地 ...
- [区块链\理解BTCD源码]GO语言实现一个区块链原型
摘要 本文构建了一个使用工作量证明机制(POW)的类BTC的区块链.将区块链持久化到一个Bolt数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作.这篇文章目的是希望帮助大家理解 ...
- Asp.Net Core 轻松学-正确使用分布式缓存
前言 本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...
- Python中最好用的命令行解析工具:argparse
Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...
- 设计模式 | 工厂方法模式(factory method)
定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 结构:(书中图,侵删) 一个工厂的抽象接口 若干个具体的工厂类 一个需要创建对象的抽象接口 若干个 ...
- 设计模式系列1:单例模式(Singleton Pattern)
定义 保证一个类仅有一个实例,并提供一个该实例的全局访问点. --<设计模式GoF> UML类图 使用场景 当类只能有一个实例并且用户可以从一个众所周知的访问点访问它时. 创建一个对象需 ...
- 设计模式之过滤器模式——Java语言描述
过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...