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练习题的更多相关文章

  1. Arrays类的运用,二分法,数组的复制,命令行参数的运用,二维数组,Object,equals

    /*Arrays jdk中为了便于开发,给开发者提供了Arrays类, 其中包含了很多数组的常用操作.例如快速输出.排序.查找等.*/ import java.util.Arrays; public ...

  2. 二维数组及Arrays工具类

    1.二维数组 概念: 数组中的每一个元素类型都是一维数组 二维数组初始化方式: 静态初始化: 格式: 元素类型[][] 数组名 = new 元素类型[][]{{一维数组1},{一维数组2},{一维数组 ...

  3. 数组属性的习题、Arrays工具、二维数组

    一.数组的练习 1.声明一个char类型的数组, 从键盘录入6个字符: [1]遍历输出 [2]排序 [3]把char数组转化成一个逆序的数组. import java.util.Scanner; pu ...

  4. java - day005 - 数组工具类, 数组复制,二维数组,变量,方法, 面向对象

    1. java.util.Arrays  数组工具类    Arrays.toString (数组) 数组值链接字符串 Arrays.sort(数组) 基本类型: 优化的快速排序 引用类型: 优化的合 ...

  5. 静态方法,Arrays类,二维数组

    一.静态方法 静态方法属于类的,可以直接使用类名.方法名()调用. 静态方法的声明 访问修饰符 static 类型 方法名(参数列表) { //方法体 } 方法的作用:一个程序分解成几个方法,有利于快 ...

  6. 常用的Arrays类和二维数组以及二分法的介绍

    ---恢复内容开始--- 1.Array类 Array中包含了许多数组的常用操作,较为常见的有: (1)快速输出 import java.util.Arrays; public class Test{ ...

  7. 首先定义一个5X8的二维数组,然后使用随机数填充满。借助Arrays的方法对二维数组进行排序。

    package day02; import java.util.Arrays; import java.util.Random; public class Test01 { public static ...

  8. [leetcode]48RotateImage二维数组翻转

    import java.util.Arrays; /** * You are given an n x n 2D matrix representing an image. Rotate the im ...

  9. LeetCode二维数组中的查找

    LeetCode 二维数组中的查找 题目描述 在一个 n*m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增.请完成一个搞笑的函数,输入这样的一个二维数组和一个整数,判断数 ...

随机推荐

  1. Spark学习之Spark SQL

    一.简介 Spark SQL 提供了以下三大功能. (1) Spark SQL 可以从各种结构化数据源(例如 JSON.Hive.Parquet 等)中读取数据. (2) Spark SQL 不仅支持 ...

  2. MySQL之父造访腾讯云 为腾讯云数据库开源点赞

    近日,技术大牛 MariaDB 公司创始人兼CTO Michael Widenius(又名Monty).MariaDB 基金会主席 Kaj 来到中国,针对MariaDB与腾讯云的技术合作进行回访.去年 ...

  3. java数据结构和算法02(栈)

    什么叫做栈(Stack)呢?这里的栈和jvm的java栈可不是一个东西... 栈作为一种数据结构,我感觉栈就类似一种接口,实现的话有很多种,比如用数组.集合.链表都可以实现栈的功能,栈最大的特点就是先 ...

  4. java~springboot~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot~目录索引 Java~关于开发工具和包包 Java ...

  5. 《阿里巴巴 Java开发手册》读后感

    前言 只有光头才能变强 前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦). 趁着学校校运会,合理地给自己放了一个小长假,然后就回家了.回到家才发现当时618 ...

  6. 第8章 动态客户端注册 - IdentityModel 中文文档(v1.0.0)

    OpenID Connect动态客户端注册的客户端库是作为HttpClient扩展方法提供的. 以下代码发送注册请求: var client = new HttpClient(); var respo ...

  7. 基于OpenStreetMap计算驾车距离(Java)

    最近公司有个项目需要计算6000个点之间的驾车距离,第一时间想到的是利用Google的Distance Matrix API,但是免费Key每天只能计算2500个元素(元素 = 起点数量 * 终点数量 ...

  8. 安卓开发笔记(二十四):手把手教你一步步集成腾讯X5内核(Tencent TBS X5)

    1.为什么要集成腾讯X5内核? X5内核相对于系统webview,具有下述明显优势: 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使流量节省20 ...

  9. VIVADO时序约束及STA基础

    一.前言 无论是FPGA应用开发还是数字IC设计,时序约束和静态时序分析(STA)都是十分重要的设计环节.在FPGA设计中,可以在综合后和实现后进行STA来查看设计是否能满足时序上的要求.本文阐述基本 ...

  10. ios11苹果手机怎么投屏到电脑

    使用过苹果手机的用户都知道,苹果手机触摸屏操作极为流畅,网页浏览也非常轻松,各种网络上的应用可以说是非常完美.iPhone的娱乐功能相当的强大,能让苹果iPhone超越了其他手机很大的距离.但是手机怎 ...