问题:Java数据结构
Java提供了非常丰富的数据结构来处理和组织数据。
Java的java.util包中提供了许多这些数据结构的实现,可以根据需要选择合适的类。
一些常见的数据结构:数组Arrays、列表Lists(包括ArrayList和LinkedList)、集合Sets(HashSet、TreeSet)映射Maps
数组总结:
数组是存放在连续内存空间上的相同类型数据的集合
5、长度最小的子数组
int result = Integer.MAX_VALUE;
int result = nums.length;//可以(不可以写成result = 0)
问题:时间复杂度logn的底数是多少?
答案:时间复杂度有底数,底数根据实际情况而定,但是没有纠结的必要。
6、螺旋矩阵||
问题:for循环中三个语句省略问题
答案:for循环中三个语句都可以任意省略,但是分号“;”不能省略。
for(;;) <==> while(true)
for(初始化语句; 判断条件语句; 控制条件语句){
循环体语句;
}
(1)省略了初始化语句,表示不对循环控制变量初值。如果已经赋值给初值了,for中的初始化语句就没必要。
int a = 5;
for(; a < 8; a++){
......
}
(2)省略判断条件语句,表示进入死循环,可以在循环体内对i进行条件判断。
(3)省略控制条件语句,表示不对循环控制变量进行控制操作 ,for(i=0;i<=5;) <==> i一直等于0,死循环。可以在循环体中增加控制语句,如i++,只要执行i++语句for循环就不会死循环。
7、区间和
问题:Java Scanner类用法
答案:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);//创建Scanner对象,从键盘接收数据
int n = scanner.nextInt();//获取输入的整数数据,n是后面总共要输入的数据个数
int[] vec = new int[n];
int[] p = new int[n];
int presum = 0;
for(int i = 0; i < n; i++){//循环n次,输入n个数据
vec[i] = scanner.nextInt();//获取每次输入的数据
presum += vec[i];//求第一个数到现在的和
p[i] = presum;//记录到数组里面
}
while(scanner.hasNextInt()){//判断是否还有数据输入,还有的输入是想要加的下标区间
int a = scanner.nextInt();//区间开始下标
int b = scanner.nextInt();//区间结束下标
int sum;//用“前缀和”求解
if(a == 0){
sum = p[b];
}else{
sum = p[b] - p[a-1];
}
System.out.println(sum);//输出求和结果
}
scanner.close();//关闭键盘资源
}
}
程序里presum的作用:作为中间变量,记录vec[0]~vec[i]的求和,相当于p[i-1]。
不用presum时,写成p[i]=p[i-1]+vec[i],会导致for循环里的限制条件不符合,有溢出。
8、开发商购买土地
问题:ACM输入输出模式是什么意思?
答案:力扣上是核心代码模式,即把要处理的数据都已经放进容器,可以直接写逻辑。
ACM (Association for Computing Machinery, 计算机协会)输入模式通常用于编程竞赛和技术面试。是需要自己构造输入数据格式,把需要处理的容器填充好,OJ (Online Judge, 在线评测系统)不会给你任何代码,包括用到的函数库都要自己写,最后也要自己控制返回数据的格式。
有精力可以再去POJ上刷题,POJ是ACM选手首选OJ,输入模式也是ACM模式。
1、使用 java.util.Scanner包
nextInt():直至读取到空格或回车之后结束本次的int值;
next():直至读取到空格或回车之后结束本次的String值,不可读取回车;
nextLine():直至读取到换行符(回车)之后结束本次读取的String,可读取回车(空值)。
2、使用 BufferedReader 和 InputStreamReader
3、各类输入输出构造
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();//区域的行数
int m = scanner.nextInt();//区域的列数
int sum = 0;//记录所有区域的总价值
int[][] vec = new int[n][m];//记录各个区域价值的二维数组
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
vec[i][j] = scanner.nextInt();//输入价值数组
sum += vec[i][j];//求总价值
}
}
//统计横向
int[] horizontal = new int[n];
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
horizontal[i] += vec[i][j];
}
}
//统计纵向
int[] vertical = new int[m];
for (int j = 0; j < m; j++){
for(int i = 0; i < n; i++){
vertical[j] += vec[i][j];
}
}
//区间和
int result = Integer.MAX_VALUE;//记录两个子区域内土地总价值之间的最小差距
int horizontalCut = 0;
for (int i = 0; i < n; i++){
horizontalCut += horizontal[i];
result = Math.min(result, Math.abs((sum - horizontalCut) - horizontalCut));
//abs:求绝对值
}
int verticalCut = 0;
for (int j = 0; j < m; j++){
verticalCut += vertical[j];
result = Math.min(result, Math.abs((sum - verticalCut) - verticalCut));
//继续用前面得到的最小的result
}
System.out.println(result);
scanner.close();//关闭键盘资源
}
}
一进循环深似海,从此offer是路人。