1. 简单的入门语法:
1.1 数据类型:
基本数据类型:
整数类型 —— byte、short、int、long,
浮点类型 —— float、double
字符类型 —— char
布尔类型 —— boolean
引用数据类型:
接口(interface)、数组([ ])、类(class)。
1.2 循环怎么写:
1) 顺序控制
2) 分支控制:
1) 单分支 if; 2) 双分支 if-else; 3) 多分支 if-elseif-....-else;4)switch 分支结构
3) 循环控制:for循环;while循环;do..while循环
1.3 数组怎么定义:
先声明数组:语法: 数据类型 数组名[]; 也可以 数据类型[] 数组名; int a [ ]; 或者 int[ ] a;
创建数组: 语法: 数组名=new 数据类型[大小]; a = new int[10];
1.4 函数是怎么写的
修饰符 返回值类型 函数名称(参数类型 参数1,参数类型参数2, . . . ){
函数执行代码;
return 返回值;
}
public static int addFunc (int a,int b) {
return a+b;
}
返回值类型:函数运行后的结果类型
参数类型:是形式参数的数据类型
形式参数:是一个变量,由于存储调用函数时传递给函数的实际参数
实际参数:传递给函数的具体值
return:用于结束函数
返回值:函数运算后的结果值,该值会返回给该函数的调用者
注意:当函数没有返回值类型是用void来表示
如果返回值类型是void,name函数中的return语句可以省略不写
2.用这个编程语言实现基础的数据结构:
2.1 顺序表:
顺序表的实现:
public class SeqList{
private int length;//表长
private int[] datas;//数据
}
顺序表的创建和初始化:
/**
* 创建空的顺序表
*/
public SeqList() {
}
/**
* 创建一个指定容量的顺序表
*
* @param capacity
*/
public SeqList(int capacity) {
length = 0;
datas = new int[capacity];
}
/**
* 构造指定容量和指定数组元素的顺序表
* @param capacity
* @param array
*/
public SeqList(int capacity, int[] array) {
if (capacity < array.length) {
throw new IndexOutOfBoundsException();
} else {
length = 0;
datas = new int[capacity];
for (int i = 0; i < array.length; i++) {
datas[i] = array[i];
length++;
}
}
}
/**
* 初始化表的最大容量
*
* @param capacity
*/
public void create(int capacity) {
if (datas != null) {
throw new RuntimeException();
} else {
length = 0;
datas = new int[capacity];
}
}
获取指定下标的元素:
/**
* 获取指定下标的元素
*
* @param index
* @return
*/
public int get(int index) {
if (index <= length && index >= 0) {
return datas[index];
} else {
throw new IndexOutOfBoundsException();
}
}
指定位置插入元素:
/**
* 指定位置插入元素
*
* @param index
* @param element
*/
public void insert(int index, int element) {
if (index >= length || index < 0) {
throw new IndexOutOfBoundsException();
} else {
if (length + 1 <= datas.length) {
for (int i = length; i > index; i--) {
datas[i] = datas[i - 1];
}
datas[index] = element;
length++;
} else {
System.out.println("表已满,无法插入");
}
}
}
删除指定下标元素:
/**
* 删除指定下标元素
*
* @param index
*/
public void delete(int index) {
if (index < 0 || index >= length) {
throw new IndexOutOfBoundsException();
} else {
for (int i = index; i < length - 1; i++) {
datas[i] = datas[i + 1];
}
length--;
}
}
其他操作:
/**
* 在表尾添加元素
*
* @param element
*/
public void add(int element) {
if (datas.length <= length) {
System.out.println("表已满,无法添加");
} else {
datas[length] = element;
length++;
}
}
/**
* 判断表是否为空
*
* @return
*/
public boolean isEmpty() {
if (datas == null || (datas.length == 0 && length == 0)) {
return true;
} else {
return false;
}
}
/**
* 清空表
*/
public void clear() {
datas = null;
length = 0;
}
/**
* 获取表长
*
* @return
*/
public int length() {
return length;
}
/**
* 获取表的最大容量
*
* @return
*/
public int getMaxSize() {
return datas.length;
}
输出顺序表的元素:
/**
* 重写toString(),输出表中元素
*
* @return
*/
@Override
public String toString() {
if (length <= 0) {
return null;
} else {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < length; i++) {
if (i == length - 1) {
sb.append(datas[i]);
} else {
sb.append(datas[i] + ",");
}
}
return sb.append("]").toString();
}
}
代码测试:
public class SeqListDemo {
public static void main(String[] args) {
int[] array=new int[]{2,4,8,3,6,1,4};
System.out.println("//创建最大容量为10,指定数组元素的顺序表");
SeqList seqList=new SeqList(10,array);//创建最大容量为10,指定数组元素的顺序表
System.out.print("获取顺序表最大容量:");
int maxSize = seqList.getMaxSize();
System.out.println(maxSize);
System.out.print("获取顺序表元素:");
System.out.println(seqList.toString());
System.out.print("获取顺序表长度:");
System.out.println(seqList.length());
System.out.print("添加元素0:");
seqList.add(0);
System.out.println(seqList.toString());
System.out.print("在第1个数前插入元素10:");
seqList.insert(0,10);
System.out.println(seqList.toString());
System.out.print("获取顺序表长度:");
System.out.println(seqList.length());
System.out.print("获取顺序表第3个数字:");
System.out.println(seqList.get(2));
System.out.println("清空顺序表");
seqList.clear();
System.out.print("顺序表元素:");
System.out.println(seqList.toString());
}
}
创建最大容量为10,指定数组元素的顺序表
获取顺序表最大容量:10
获取顺序表元素:[2,4,8,3,6,1,4]
获取顺序表长度:7
添加元素0:[2,4,8,3,6,1,4,0]
在第1个数前插入元素10:[10,2,4,8,3,6,1,4,0]
获取顺序表长度:9
获取顺序表第3个数字:4
清空顺序表元素:null
2.2 串:
Java String类:
创建字符串
创建一个String对象,并初始化一个值。
String类是不可改变的,一旦创建了一个String对象,它的值就不能改变了。
如果想对字符串做修改,需要使用StringBuffer&StringBuilder类。
//直接创建方式
String str1 = "abc";
//提供一个 字符数组 参数来初始化字符串
char[] strarray = {'a','b','c'};
String str2 = new String(strarray);
char 为字符类型,String为字符串类型
String 字符串是用" "来包含串的, char是用’ '来包含单字符的
String 内部用来存储的结果是一个char字符数组
字符串长度获取
int length()方法:返回字符串对象包含的字符数。
int len = str.length();
连接字符串
String concat(String str):连接两个字符串的方法
或者直接用‘+’操作符来连接
//String对象的连接
str1.concat(str2);
"两个字符串连接结果:"+str1+str2;
字符串查找
int indexOf(String s):字符串s在指定字符串中首次出现的索引位置,如果没有检索到字符串s,该方法返回-1
int lastIndexOf(String s):字符串s在指定字符串中最后一次出现的索引位置,如果没有检索到字符串s,该方法返回-1;如果s是空字符串,则返回的结果与length方法的返回结果相同,即返回整个字符串的长度。
int idx = str.indexOf("a");//字符a在str中首次出现的位置
int idx = str.lastIndexOf("a");
获取指定位置的字符串
char charAt(int index)方法:返回指定索引出的字符
String str = "abcde";
char thischar = str.charAt(3);//索引为3的thischar是"d"
获取子字符串
String substring()方法:实现截取字符串,利用字符串的下标索引来截取(字符串的下标是从0开始的,在字符串中空格占用一个索引位置)
1. substring(int beginIndex):截取从指定索引位置开始到字符串结尾的子串
2. substring(int beginIndex, int endIndex):从beginIndex开始,到endIndex结束(不包括endIndex)
String str = "abcde";
String substr1 = str.substring(2);//substr1为"cde"
String substr2 = str.substring(2,4);//substr2为"cd"
去除字符串首尾的空格()
String trim()方法
String str = " ab cde ";
String str1 = str.trim();//str1为"ab cde"
字符串替换
1.String replace(char oldChar, char newChar):将指定的字符/字符串oldchar全部替换成新的字符/字符串newChar
2.String replaceAll(String regex, String replacement):使用给定的参数 replacement替换字符串所有匹配给定的正则表达式的子字符串
3. String replaceFirst(String regex, String replacement):使用给定replacement 替换此字符串匹配给定的正则表达式的第一个子字符串
regex是正则表达式,替换成功返回替换的字符串,替换失败返回原字符串
String str = "abcde";
String newstr = str.replace("a","A");//newstr为"Abcde"
判断字符串的开始与结尾
boolean startsWith()
1.boolean startsWith(String prefix):判断此字符串是否以指定的后缀prefix开始
2.boolean startsWith(String prefix, int beginidx):判断此字符串中从beginidx开始的子串是否以指定的后缀prefix开始
3. boolean endsWith(String suffix):判断此字符串是否以指定的后缀suffix结束
String str = "abcde";
boolean res = str.startsWith("ab");//res为true
boolean res = str.StartsWith("bc",1);//res为true
boolean res = str.endsWith("de");//res为true
判断字符串是否相等
1. boolean equals(Object anObject):将此字符串与指定的对象比较,区分大小写
2. boolean equalsIgnoreCase(String anotherString):将此 String 与另一个 String 比较,不考虑大小写
String str1 = "abcde";
String str2 = str1;//字符串str1和str2都是一个字符串对象
String str3 = "ABCDE";
boolean isEqualed = str1.equals(str2);//返回true
boolean isEqualed = str1.equals(str3);//返回false
boolean isEqualed = str1.equlasIgnoreCase(str3);//返回true
比较两个字符串
1. int compareTo(Object o):把这个字符串和另一个对象比较。
2. int compareTo(String anotherString):按字典顺序比较两个字符串。
比较对应字符的大小(ASCII码顺序),如果参数字符串等于此字符串,则返回值 0;如果此字符串小于字符串参数,则返回一个小于 0 的值;如果此字符串大于字符串参数,则返回一个大于 0 的值。
String str1 = "abcde";
String str2 = "abcde123";
String str3 = str1;
int res = str1.compareTo(str2);//res = -3
int res = str1.compareTo(str3);//res = 0
int res = str2.compareTo(str1);//res = 3
把字符串转换为相应的数值
String转int型:
//第一种
int i = Integer.parseInt(String str)
//第二种
int i = Integer.valueOf(s).intValue();
String转long型:
long l = Long.parseLong(String str);
String转double型:
double d = Double.valueOf(String str).doubleValue();//doubleValue()不要也可
double d = Double.parseDouble(str);
int转string型:
//第一种
String s = String.valueOf(i);
//第二种
String s = Integer.toString(i);
//第三种
String s = "" + i;
字符大小写转换
String toLowerCase():将字符串中的所有字符从大写字母改写为小写字母
String toUpperCase():将字符串中的所有字符从小写字母改写为大写字母
String str1 = "abcde";
String str2 = str1.toUpperCase();//str2 = "ABCDE";
String str3 = str2.toLowerCase();//str3 = "abcde";
字符串分割
String[] split():根据匹配给定的正则表达式来拆分字符串,将分割后的结果存入字符数组中。
1. String[] split(String regex):regex为正则表达式分隔符, . 、 $、 | 和 * 等转义字符,必须得加 \\;多个分隔符,可以用 | 作为连字符。
2. String[] split(String regex, int limit):limit为分割份数
String str = "Hello World A.B.C"
String[] res = str.split(" ");//res = {"Hello","World","A.B.C"}
String[] res = str.split(" ",2);//res = {"Hello","World A.B.C"}
String[] res = str.split("\\.");//res = {"Hello World A","B","C"}
String str = "A=1 and B=2 or C=3"
String[] res = str.split("and|or");//res = {"A=1 "," B=2 "," C=3"}
字符数组与字符串的转换
public String(char[] value) :通过char[]数组来创建字符串
char[] toCharArray():将此字符串转换为一个新的字符数组。
String str = "abcde";
char mychar[] = str.toCharArray();//char[0] = 'a'; char[1] = 'b'...
字符串与byte数组的转换
byte[] getBytes()
1. byte[] getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
2. byte[] getBytes(String charsetName):使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
byte[] Str2 = Str1.getBytes();
StringBuffer&StringBuilder类
与String类最大的不同在于这两个类可以对字符串进行修改。
StringBuilder相较StringBuffer来说速度较快,多数情况下使用StringBuilder,但是StringBuilder的方法不是线性安全的(不能同步访问),所以在应用程序要求线程安全的情况下,必须使用StringBuffer。
创建StringBuffer字符串
StringBuffer str = new StringBuffer("");
添加字符(最常用方法)
public StringBuffer append(String s):将指定的字符串追加到字符序列中
str.append("abc");//此时str为“abc”
删除字符串中的指定字符
public delete(int start,int end):移除此序列中的子字符串的内容
public deleteCharAt(int i):删除指定位置的字符
str.delete(0,1);//此时str为“c”
str.deleteCharAt(str.length()-1);//删除最后一个字符
翻转字符串
public StringBuffer reverse()
str.reverse();
替换字符串中内容
replace(int start,int end,String str):用String类型的字符串str替换此字符串的子字符串中的内容
String s = "1";
str.replace(1,1,s);//此时str为"a1c"
插入字符
public insert(int offset, int i):将int参数形式的字符串表示形式插入此序列中
str.insert(1,2);
字符串长度
int length():返回长度(字符数)
void setLength(int new Length):设置字符序列的长度
str.length();
str.setLength(4);
当前容量
int capacity():获取当前容量
void ensureCapacity(int minimumCapacity):确保容量小于指定的最小值
str.capacity();
将其转变为String
String toString()
str.toString();//将StringBuffer类型的序列转变为String类型的字符串
设置指定索引处的字符
void setCharAt(int index,char ch):将给定索引处的字符设置为ch
其余方法和String类型的方法大致相同。
2.3 链表
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
链表可分为单向链表和双向链表。
一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。
一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。
Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。
与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。
以下情况使用 ArrayList :
- 频繁访问列表中的某一个元素。
- 只需要在列表末尾进行添加和删除元素操作。
以下情况使用 LinkedList :
- 你需要通过循环迭代来访问列表中的某些元素。
- 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
2.4 栈
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
Stack()
除了由Vector定义的所有方法,自己也定义了一些方法:
实例:
import java.util.*;
public class StackDemo {
static void showpush(Stack<Integer> st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showpop(Stack<Integer> st) {
System.out.print("pop -> ");
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack<Integer> st = new Stack<Integer>();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpush(st, 99);
showpop(st);
showpop(st);
showpop(st);
try {
showpop(st);
} catch (EmptyStackException e) {
System.out.println("empty stack");
}
}
}
以上实例编译运行结果如下:
stack: [ ]
push(42)
stack: [42]
push(66)
stack: [42, 66]
push(99)
stack: [42, 66, 99]
pop -> 99
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: [ ]
pop -> empty stack
2.5 队列
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue<String> queue = new LinkedList<String>();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
}
}
a
b
c
d
e
===
poll=a
b
c
d
e
===
element=b
b
c
d
e
===
peek=b
b
c
d
e
2.6 树
在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点都只有有限个子节点或无子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
- 树里面没有环路(cycle)
为什么需要树?
因为它结合了另外两种数据结构的优点: 一种是有序数组,另一种是链表。在树中查找数据项的速度和在有序数组中查找一样快, 并且插入数据项和删除数据项的速度也和链表一样。
// 节点类
class TreeNode {
private int value;
private TreeNode left;
private TreeNode right;
public TreeNode(int value) {
this.value = value;
this.left = null;
this.right = null;
}
// 获取节点值
public int getValue() {
return value;
}
// 设置左子节点
public void setLeft(TreeNode left) {
this.left = left;
}
// 获取左子节点
public TreeNode getLeft() {
return left;
}
// 设置右子节点
public void setRight(TreeNode right) {
this.right = right;
}
// 获取右子节点
public TreeNode getRight() {
return right;
}
}
// 树类
class Tree {
private TreeNode root;
public Tree() {
this.root = null;
}
// 插入节点
public void insert(int value) {
root = insertNode(root, value);
}
private TreeNode insertNode(TreeNode node, int value) {
if (node == null) {
return new TreeNode(value);
}
if (value < node.getValue()) {
node.setLeft(insertNode(node.getLeft(), value));
} else if (value > node.getValue()) {
node.setRight(insertNode(node.getRight(), value));
}
return node;
}
// 遍历树(示例为中序遍历)
public void traverse() {
inOrderTraversal(root);
}
private void inOrderTraversal(TreeNode node) {
if (node != null) {
inOrderTraversal(node.getLeft());
System.out.print(node.getValue() + " ");
inOrderTraversal(node.getRight());
}
}
}
// 测试代码
public class Main {
public static void main(String[] args) {
Tree tree = new Tree();
// 插入节点
tree.insert(5);
tree.insert(3);
tree.insert(7);
tree.insert(2);
tree.insert(4);
tree.insert(6);
tree.insert(8);
// 遍历树
tree.traverse();
}
}
2.7 二叉树
二叉树的结构就是一个父节点挂一个或者两个子节点
2.8 二叉搜索树
2.9 图
2.10 邻接矩阵
2.11 邻接表
2.12 哈希表;
3. 刷一些基础的算法题,提升编程思维:
3.1 线性枚举,
3.2 排序,
3.3 模拟
3.4 贪心
3.5 二分枚举
3.6 深搜
3.7 广搜