代码逻辑训练习题

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习OpenFeign学习Hystrix学习


前言

本文介绍经过一周学习后,老师留的6道课后习题。题目在相应代码最上方注释。


第一题:求阶乘

代码:

	/*
    1、求15的阶乘。
     */
    public static void main(String[] args) {
        long sum = 1;
        for (int i = 1; i <= 15; i++){
            sum *= i;
            System.out.println(sum);
        }
        //int存储不下15的阶乘,必须用比int大的long型
        System.out.println("15的阶乘为:\t" + sum);
    }

代码解释: 使用循环遍历1-15来求15的阶乘,最后输出。

代码结果:
在这里插入图片描述

第二题:鸡兔同笼

代码:

	/*
    2、有若干只鸡兔同在一个笼子里,有35个头,有94只脚。问笼中各有多少只鸡和兔?
     */
    public static void main(String[] args) {
        int x = 1;
        for ( ; x <= 35; x++)
            if ((x * 2 + (35 - x) * 4) == 94)
                break;
        //上面算式可以简化成35 * 4 - 2 * x == 94,但这么写更符合逻辑
        System.out.println("鸡有" + x + "只," + "兔有" + (35 - x) + "只。");
        System.out.println(x + " X 2 + " + (35 - x) + " X 4 = " + (x * 2 + (35 - x) * 4));
    }

代码解释: 我们使用Java编写数学题,不需要像我们初中做的那样列方程,只需要让代码从头开始遍历,让他试出来即可。
我们使用for循环从1只鸡开始试,直到(x * 2 + (35 - x) * 4) == 94这一条件的达成,我们再使用break,最后输出。

代码结果:
在这里插入图片描述

第三题:多次删除数组元素

代码:

/*
    3、已知数据:
    String[] strs = {"1", "2", "3", "3", "2", "1"};
    String s = "3";
    移除strs数组中所有和s相同的元素。
    完成的同学思考一下如何修改课上代码的getIndex方法和deleteArray1方法解决这个问题。
    课上写的代码在最后(代码可能不完全一样,实现的功能肯定一样)
     */

    public static void main(String[] args) {
        String[] strs = {"1", "2", "3", "3", "2", "1"};
        //测试数组2
        //String[] strs = {"1", "2", "3", "3", "2", "2", "3", "3", "2", "2", "3", "1"};
        String s = "3";
        delateToday(strs, s);
        System.out.println("以下为修改课上代码以达成此目的");
        strs = new String[]{"1", "2", "3", "3", "2", "1"};
        //较课上修改部分区别如下,循环删除而不是删除,简单暴力且有效,但浪费运算时间,如果数组大的话会表现明显
        for (int i = 1; i <= strs.length; i++)
            deleteArr1AfterChange(strs, s);
    }
    public static void delateToday(String[] strs, String s){
        //基本逻辑,从头遍历,每次遇到相同字符串进行删除操作,下标减1,继续遍历,直到遍历到空值
        for (int i = 1; (i < strs.length && strs[i] != null); i++){
            //System.out.println(Arrays.toString(strs) + "dddddd");
            if (strs[i].equals(s)){
                for (int j = i; j < strs.length; j++){
                    if ((j + 1) < strs.length){
                        strs[j] = strs[j + 1];
                        continue;
                    }
                    strs[j] = null;
                    break;
                }
                System.out.println("第" + i-- + "位已被删除,改后数组为:" + Arrays.toString(strs));
                //以防有并列的同一个数,变量i需要进行自减操作i--
            }
        }
        System.out.println("最终结果:" + Arrays.toString(strs));
    }

    public static void deleteArr1AfterChange(String[] ages, String b){
        //先判断数组中是否存在该元素:
        int x = getIndexAfterChange(ages, b);
        if (x != -1){
             for (int i = x; (i < ages.length && ages[i] != null); i++){
                if (i + 1 < ages.length){
                    ages[i] = ages[i + 1];
                    continue;
                }
                ages[i] = null;
            }
        }else{
            System.out.println("the element does not exist");
        }
        if (x != -1)
            System.out.println("改后数组:" + Arrays.toString(ages));
    }

    public static int getIndexAfterChange(String[] names, String str) {
        int x = -1;
        for (int i = 0; i < names.length; i++){
            if (str.equals(names[i])){
                x = i;
                break;
            }
        }
        return x;

    }
/*
    public static void deleteArr1(String[] ages, String b){
        //先判断数组中是否存在该元素:
        System.out.println(Arrays.toString(ages));
        int x = getArr5(ages, b);
        if (x != -1){
            for (int i = x; (i < ages.length && ages[i] != null); i++){
                if (i + 1 < ages.length){
                    ages[i] = ages[i + 1];
                    continue;
                }
                ages[i] = null;
            }
        }else
            System.out.println("the element does not exist");

        System.out.println(Arrays.toString(ages));
    }

    public static int getArr5(String[] names, String str) {
        int x = -1;

       for (int i = 0; i < names.length; i++){
           if (str.equals(names[i])){
               x = i;
               break;
           }
       }
        return x;

    }
     */

代码解释: 此代码分为两个部分
…1、delateToday方法用一个方法实现题目功能,要注意的是每次进行删除操作后需要进行下标自减操作,以避免相邻元素都需要删除
…2、deleteArr1AfterChange方法、getIndexAfterChange方法是改后的上课时的代码(上课时的代码只能删除一次相匹配的元素),我们将其放至循环中,使其重复执行6次。

代码结果:
在这里插入图片描述

第四题:大数相加求精度

代码:

/*
    4、已知数据:
float f1 =12345678;
float f2 = 87654321;
求f1+f2的结果。
     */
    public static void main(String[] args) {
        float f1 = 12345678;
        float f2 = 87654321;
        //失败案例3,无能为力了,每次都是99999998
        long fsum = 0;
        fsum = (((Float)f1).longValue() + ((Float)f2).longValue());
        System.out.println(fsum);
        /*
        失败案例2
        BigDecimal bd1 = new BigDecimal(Float.toString(f1));
        BigDecimal bd2 = new BigDecimal(Float.toString(f2));

        BigDecimal sum = bd1.add(bd2);

        System.out.println(sum.toPlainString());
         */
        /*
        失败案例1
        //如果fsum是float型,输出结果为1.0E8
        Double fsum = 0.0;
        fsum = (((Float)f1).doubleValue() + ((Float)f2).doubleValue());
        System.out.println(fsum.longValue());
         */

    }

代码解释: 如果简单使用float型来存储他俩的和,那么输出结果为10的8次方,正确结果应该是99 999 999。如果把float转为Float再转为Double最后输出long型,输出为99 999 998,如果使用BigDecimal来存储数据,结果依然是99 999 998,最后尝试转为Float型后直接转为long型,输出结果依然是99 999 998。
寻思半天最后问老师后才知道,这道题是陷阱题,根本不能输出99 999 999,计算机计算就是有这样的缺陷。

代码结果:
在这里插入图片描述

第五题:数组合并去重

代码:

    /*
    5、已知数据:
    String[] strs1 = {"1", "2", "3", "4", "5", "1"};
    String[] strs2 = {"a", "b", "c", "4", "e", "5"};
    将两个数组合并成一个数组,并去掉重复的元素。
     */
    public static void main(String[] args) {
        String[] strs1 = {"1", "2", "3", "4", "5", "1"};
        String[] strs2 = {"a", "b", "c", "4", "e", "5"};
        String[] strsum = new String[strs1.length + strs2.length];
        int sumfristnull = -1;
        for (int i = 0; i < strs1.length; i++){
            strsum[i] = strs1[i];
        }
        System.out.println(Arrays.toString(strsum));
        a: for (int j = 0; j < strs2.length; j++){
            b: for (int i = 0; i < strs1.length; i++){
                if (strs2[j] == strs1[i])
                    continue a;
            }
            sumfristnull = theFirstNull(strsum);
            strsum[sumfristnull] = strs2[j];
            //System.out.println(Arrays.toString(strsum));
        }
        System.out.println(Arrays.toString(strsum));
    }
    public static int theFirstNull(String[] strsum){
        for (int i = 0; i < strsum.length; i++){
            //必须用==,不能用.eqlues()方法
            if (strsum[i] == null){
                //System.out.println(i);
                return i;
            }
        }
        return 0;
    }

代码解释:
先将strs1先导入strsum,在导入strs2时,每个元素判断是否已经有了,如果没有,定义theFirstNull方法找到数组中第一个空值的下标,将新元素插入strsum数组;如果str1已经导入过这个元素,那么不进行插入,continue跳过本轮循环。

代码结果:
在这里插入图片描述

第六题:账号登录

代码:

    /*
    6、已知有三组账号和密码:
    账号        密码
    admin    123456
    lisi     abcdef
    wangwu   123def
    实现在控制台输入账号和密码,用程序判断是否登录成功。
     */
    public static void main(String[] args) {
        String[] userName = {"admin", "lisi", "wangwu"};
        String[] Password = {"123456", "abcdef", "123def"};
        boolean userNameFound = false;
        Scanner scanner = new Scanner(System.in);
        System.out.println("Please enter your username: ");
        String enterUserName = scanner.next();
        System.out.println("Please enter your password: ");
        String enterPassword = scanner.next();

        for (int i = 0; i < userName.length; i++){
            if (userName[i].equals(enterUserName)){
                userNameFound = true;
                if (Password[i].equals(enterPassword))
                    System.out.println("(∩_∩)login success!Your username is :" + userName[i] + ",Your password is :" + Password[i]);
                else
                    System.out.println("(>﹏<)login fail...Your password is not correct.");
            }
        }
        if (userNameFound == false)
            System.out.println("(>﹏<)login fail...Your username wasn't been created.");
    }

代码解释:
分析:三种情况:
…1、用户名存在,密码匹配:登陆成功
…2、用户名存在,密码不匹配:登陆失败,提示密码错误
…3、用户名不存在,不判断密码匹不匹配:登陆失败,提示用户名不存在

代码结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

本文介绍了关于循环、判断、数组的相关练习题,请理解其中逻辑并学会如何解决此类问题,能帮到你就很好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攸攸太上

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值