收获:
1.更好的运用和理解二维数组
案例:四行五列,从左上角走到右下角,求路线个数
如图,到每一格的路线的个数是上和左两格所有路线的总和,依照这图我们可以创建一个二维数组
int[i][j]arr i和j分别行和列用于定位二维数组再图中对应的位置。
if(i==0||j==0){
arr[i][j]=1;
}else {
arr[i][j]=arr[i][j-1]+arr[i-1][j];
}
内循环中设置第一行和第一列的项均为1,设定每一项的值为上和左两项之和,最后求出最后一项arr[3][4]的值为路线总个数值
2.运用一定的数学思维:某数因数的因数也是这个数的因数
案例:n为2021041820210418,求三个整数相乘等于n有多少种方法(原题是长宽高,所以不考虑重复:如1.2.3和2.1.3)
这道题可以暴力算法,但是运行要运行很久,所以这道题的目的是运用算法提高效率
因为是三个因数比较懊恼,一般想法是分成两个因数然后再从其中一个因数里分,没有实践过这种想法因为想起来太懊恼且代码复杂。这里可以用一个大家其实都知道但是不太常用的方法,就是某数因数的因数也是这个数的因数,我们只要把n的所有因数求出并把所有因数放入一个集合里,再通过一个循环将里的数任意三个相乘,如果等于n就count++,最后打印count即可。
3.案例:用杂志拼接信件
思路:创建一个26个元素的数组,对应26个字母。因为char字符相加是数字,所以可以用字符串提取出的字符与'a'相减当作索引,将其对应的数组里的项加1,说明再字符串a里有多少个对应的字符。再通过同样的方法作用于字符串b,并将每个字符对应的项减一,如果项小于0说明不能拼接。
4.实心圆和空心圆(更深的理解双循环)
分析:代码还算简单,主要再x和y对于r的关系,这道题的意义在于更好的理解了双循环,个人感觉双循环和二维数组在一定程度上有异曲同工之妙。
5.原码,反码,补码(用异或来交换两个数以及转化二进制的核心(感觉))
案例:
int a=9; System.out.println(Integer.toBinaryString(a));//转化为2进制,但是是字符串类型 System.out.println(Integer.toString(a,2));//转化为2进制,但是是字符串类型 //1001 a=-9; System.out.println(Integer.toBinaryString(a)); System.out.println(Integer.toString(a,2)); //11111111111111111111111111110111 //因为Integer.toBinaryString(a)直接获取计算机存储的,但是计算机存储的是补码 //-1001 //Integer.toString(a,2)是将a用2除从而转化为二进制,准确 /* 9 正数 原码,补码,反码全部相同 00000000 00000000 00000000 00001001 -9 10000000 00000000 00000000 00001001原码 11111111 11111111 11111111 111101101反码:原码相反,也就是和原码互补 11111111 11111111 11111111 111101101 补码:反码+1
一些今天常用到的关键的方法:
1.用Math.max();可以求两数之间最大的
int temp=Math.max(c,Math.max(a,b));(这里是三个数,套娃)
2.用异或来交换两个数
a=a^b;
b=a^b;
a=a^b;
3.Arrays.sort();改变当前数组,将数组里的数从小到大排列
4.char[]ch=f1.toCharArray();将字符串f1转化为char数组
5.int result=Integer.parseInt(f1);将字符串f1转化为数字result
6.String f1=Integer.toString(num);将数字num转化为字符串f1
7.str.charAt(i);将str中第(i-1)个字符提取出来
8.不知道怎么表述,就是很妙
int count=0; for(int i=0;i<=2020;i++){ int n=i; while (n!=0){ if ( n%10==2){ count++; } n=n/10; } } System.out.println("需要:"+count+"个2");
现在看简单,写的时候想不到