案例训练1.21

本文介绍了如何利用二维数组解决路径计数问题,运用数学思维处理因数分解问题,以及深入理解双循环和字符数组操作。还探讨了原码、补码和反码的概念,以及使用异或进行数据交换。作者通过实际编程案例展示了如何通过算法优化提升效率。
摘要由CSDN通过智能技术生成

收获:


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");

现在看简单,写的时候想不到

总结:今天写了很多题,一开始觉得很难各种出错,到晚上感觉就好起来的思路和想法能和自己和代码更紧密的联系,一些小细节差错也改正,正确率提高。感觉写代码思路要打开,对一些类自带的方法要掌握,比如上面举例的,以及今天意识到了但还没整理的String类相关方法(感觉很重要)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值