## 数组
排序
经典的三大排序:冒泡,选择,插入
(一)冒泡排序核心:数组中的 相邻 两项比较,交换(正序or倒序)
正序原理图:

代码实现:
public static void sort(int[] a){
for (int i = 0; i < a.length; i++) {
//i < a.length-1 也可以
for (int j = 0; j < a.length-i-1; j++) {
//-1防止数组越界
if (a[j]>a[j+1]){//相邻
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
问题:如果数组本身有序,依然进行大量比较,但没有排序交换。
做一个开关判断
package com.ffyc.Sort;
/**
* 冒泡排序--"相邻"
*/
public class BubbleSortDemo {
public static void sort(int[] a){
for (int i = 0; i < a.length; i++) {//控制冒泡排序次数
//a.length-1 也可以
boolean f= true;//开关
for (int j = 0; j < a.length-i-1; j++) {
//-1防止数组越界 -i相当于优化了一下下
if (a[j]>a[j+1]){//相邻
f=false;
int temp = a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
if (f) break;
}
}
public static void print(int[] a){
for (int t : a){
System.out.print(t+"\t");
}
}
public static void main(String[] args) {
int[] a = {1,2,3,6};
sort(a);
print(a);
}
}
(二)选择排序
核心:一次循环找出最大/小值
原理图:

代码:

//优化:减少交换次数
package com.ffyc.Sort;
/**
* 选择排序
*/
public class SelectSortDemo {
public static void sort(int[] a){
for (int i = 0; i < a.length; i++) {
int min = a[i];
int pos = i;
for (int j = i+1 ;j <a.length ; j++) {
if (min > a[j]){//不是最小值
min = a[j];
pos = j;//j是最小值的下标位置
}
}
//找到最小值之后进行交换
a[pos]=a[i];
a[i]=min;
}
}
public static void print(int[] a){
for (int t : a){
System.out.print(t+"\t");
}
}
public static void main(String[] args) {
int [] a= {4,3,6,1,8};
sort(a);
print(a);
}
}
常规和优化耗时比较:
public static void sort(int[] a) {//优化
long s1 = System.nanoTime();
for (int i = 0; i < a.length; i++) {
int min = a[i];
int pos = i;
for (int j = i + 1; j < a.length; j++) {
if (min > a[j]) { //不是最小值
min = a[j];
pos = j; //j是最小值位置
}
}
//找到最小值之后进行交换
a[pos] = a[i];
a[i] = min;
}
long s2 = System.nanoTime();
System.out.println("耗时1: " + (s2 - s1));
}
public static void sortx(int[] a) {//原始
long s1 = System.nanoTime();
for (int i = 0; i < a.length; i++) {
int min = a[i];
for (int j = i + 1; j < a.length; j++) {
if (min > a[j]) { //不是最小值
min = a[j];
a[j] = a[i];
a[i] = min;
}
}
}
long s2 = System.nanoTime();
System.out.println("耗时x: " + (s2 - s1));
}
(三)插入排序–联想“打扑克”
覆盖过程


希尔排序
bigO表示法
O(n)
O(1)

O(n)
取平均,去掉常数;O(n/2+1)==》O(n)

O(n^2)
不一样是O(n*m)
空间复杂度稳定,

循环分开实现O(2n),比嵌套的效率高O(n2)–>O(n)<O(n2)
数组辅助类:Arrays
数组转换为字符串
Arrays**.toString**(数组)–>字符串
fill
填充,和sort一样可以选择范围
equals

copyof
数组拷贝
binarySearch
二分查找(前提:有序)

结果<0 ===》 代表没找到

数组删除问题

Arrays.copyOfRange 是Java中的一个数组操作方法,它用于复制指定数组的指定范围的元素到一个新数组中。这个方法的详细用法和示例如下:
[Arrays.copyOfRange) 用法:左闭右开
javapublic static int[] copyOfRange(int[] original, int from, int to)
参数说明:
original:要复制的原始数组。from:复制的起始索引(包含)。to:复制的结束索引(不包含)。- 注:数组位置从0开始,length不是最后一个,length-1是最后一个。
多维数组(二维)
本质:一维数组——看作一张表,行-列,坐标
一维数组
紧紧相连,不断开;断开就成链表了

二维数组
定义:一维数组的元素是一个一维数组。

int [][] a = new int[5][];//false
int [][] a = new int[][5];//true
java需要确定的是行(一维数组)。

打印:
String[] ball = {“●”, “○”};

String——第九大类型
能够使用String,char[];String不是基本类型

字符串
本质是字符数组

字符串长度获取
str.length
字符串和字符数组的转换

问题:有一个字符串“apple”,统计出现次数最多的字符。
桶排序

Api==》接口(别人写好的)
常用的几个(Application Programming Interface)
-
trim:常用于从用户输入中去除(第一个字符之前的空格,最后一个字符之后空格)不必要的空格,或者验证输入是否为空。
-
toUppercase:转大写
-
toLowcase:转小写
-
c1.equalsIgnoreCase(c2));//忽略大小写比较
-
(String)s.charAt(i); //取字符串中的单个字符
-
s.substring(startIndex,endIndex) : 截取字符串,[左闭右开)
-
s.spilt(字符串) : 分割字符串
-
如果忘了:ctrl+o 找你要用的
indexOf()/lastIndexOf()/replace()
indexOf()方法用于在字符串中查找指定子字符串第一次出现的位置,并返回其索引。如果未找到子字符串,则返回 -1。lastIndexOf()方法与indexOf()类似,但它是从字符串末尾开始搜索指定子字符串最后一次出现的位置。replace()方法用于在字符串中用一个新的子字符串替换匹配的子字符串(或者使用正则表达式替换)。
indexOf()和lastIndexOf()用于查找字符串中的子字符串,并返回其索引或者-1(未找到)。replace()用于将字符串中的指定子字符串(或者匹配的正则表达式)替换为新的子字符串。
解析-xxx-之间的信息
法一
package com.ffyc.string;
public class StringApiDemo04 {
public static void main(String[] args) {
String str = "001-脱缰凯-男-16-班长-555.00";
int s1 = str.indexOf("-");
int s2 = str.indexOf("-", s1 + 1);
int s3 = str.indexOf("-", s2 + 1);
int s4 = str.indexOf("-", s3 + 1);
int s5 = str.lastIndexOf("-");
//解析 名字
String s0 = str.substring(0, s1);//[截取字符)001
System.out.println(s0);
String s = str.substring(s1+1, s2);//[截取字符)
System.out.println(s);
String ss = str.substring(s2+1, s3);//[截取字符)
System.out.println(ss);
String sss = str.substring(s3+1, s4);//[截取字符)
System.out.println(sss);
String ssss = str.substring(s4+1, s5);//[截取字符)
System.out.println(ssss);
//解析 薪水
String sal = str.substring(s5+1);
System.out.println(sal);
//递归
}
}

法二 的 函数
public static void parsex(String str){
String[] split = str.split("-");
for (String s : split) {
System.out.println(s);
}
}
法三函数
public static void parse(String str){
while (true) {
int index = str.indexOf("-");
if (index<0){
System.out.println(str);
break;
}
System.out.println(str.substring(0,index));
str = str.substring(index+1);
}
}
常用的API总结
| 编号 | API | 解释 |
|---|---|---|
| 1 | .length | 长度 |
| 2 | .substring(m,n) | 截取 |
| 3 | .toUpperCase() | 大写 |
| 4 | .toLowerCase() | 小写 |
| 5 | .equals() | 等于 |
| 6 | .indexOf() | 子字符串位置 |
| 7 | .trim() | 去空格 |
| 8 | .replace() | 替换 |
| 9 | .lastIndexOf() | 从后向前 |
| 10 | .spilt() | 分割 |
| 11 | .toCharArrays() | 数组 |
| 12 | .charAt() | 某位的字符 |
| 13 | .valueOf() | 将其他类型转换为字符串 |
| 14 | .endWith() | 以".jpg"结尾 |
| 15 | .statrWith() | 以什么开头 |
| 16 | .isEmpty() | 为空 |
| 17 | .contains() | 是否存在 |
| 18 | new String(“abc”) | 产生一个字符串 |
| 19 | .replaceAll() | 替换所有 |

String包
在java.lang包——不用引入
压缩软件可以打开包(文件夹)
(D:)>dev>jdk8>jre >lib >

完全限定名 就近原则String–》解决用这个完全限定名(下面的黄字打错了)

import

package


转换为字符串
+

valueof

注意区分“拼接”与“运算”
endwith/startwith

isEmpty 的空 --内容空
- 对象存在,里面(内容为空)没有字符 --isEmpty,返回t/f
- 对象不存在 --null

sum:
产生一个字符串

下面的是java正常使用的方法,上面是人们简写后的
问题

???
正则表达式
问题提出
判断一个数全部是数字

问题解决
写一个表达式按规则完成对字符串的判定过程

应用场景
身份证
电话号码
邮箱
用户名、密码·
对字符串的特殊要求—— 电话号:1xx 4343
基本表达式
一个【】只匹配一次
匹配一个数字
异或号^ :不是xxx,表示非
[^0-9]//不是0~9的所有字符
match匹配
匹配一个字母
[a-z]
判断是否是中文
[\u4e00-\u9fa5]
package com.ffyc.Regex;
/**
* 正则表达式——单字符判断
*/
public class RegexDemo02 {
public static void main(String[] args) {
String s = "a";
String n = "1";
String regex = "[a-zA-Z]";//[]里的多个只代表一个
System.out.println(s.matches(regex));
System.out.println(n.matches(regex));
//判断是否是中文 4e00~9fa5
String chinese = "中";
String reg = "[\u4e00-\u9fa5]";//- 表示一个范围
System.out.println(chinese.matches(reg));
}
}
任意字符表示——.(不加【】)

//true
匹配多个字符{n}

n:要匹配的个数,精确匹配n次
{m,n}:从m倒n位匹配
{m,}

+:至少有一次匹配
?:要么零次要么一次
问题:客户输入一个数字(浮点型,整形)
12,6565.448
问题:网站要求使用者年龄范围在18~60之间
客户:21 true
客户: 17 false
|:或者
package com.ffyc.Regex;
/**
* 18-60
*/
public class RegexPro01 {
public static void main(String[] args) {
String str = "19";
/*
分组-------------
|:或者
1.(18,19)
2.(2 3 4 5 )(0-9)
3.60
*/
String regex = "(1[8-9])|[2-5][0-9]|(60)";
System.out.println(str.matches(regex));
}
}
问题:输入一个合法电话号码
1开头 ;3/8/9在第二位 ;后面几位随意
String+正则
spilt()

replaceAll()

String问题
本质-源代码-是字符数组–final–是不可以变的

String s = Str.substring(0,5);//str,s
str = str.substring(0,5);
慢、

StringBuilder 快
删9

回文

StringBuilder版回文

改成: 
reverse()
字符串反转

toString()
转换为字符串形式
力扣344 暴力法

源码



















