代码随想录1-数组

问题: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模式。

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是路人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值