【Java刷题笔记】牛客网Java入门 1~4

类型转换

描述

设计一个方法,将一个小于2147483647的double类型变量以截断取整方式转化为int类型

输入描述:

随机double类型变量

输出描述:

转化后的int类型变量

示例1

输入:

12.34

输出:

12

示例2

输入:

1.88

输出:

1

内心想法:

最简单的做法应该就是一个强制转换类型了,虽然也有其他耗时又短内存又小的写法,但并不够“入门”(真的不是我不会(doge ),在此不作介绍。与此同时看到限制说“将一个小于2147483647的double类型变量”,内心一笑。

代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double d = scanner.nextDouble();
        System.out.println(Main.typeConversion(d));
    }
    public static int typeConversion(double d){
        return (int)d;
    }
}

收获:

其实上面代码还是加上限制输入的double变量小于2147483647比较严谨,虽然这种测试数据不加也能过(绝不是我懒)。因为进行强制类型转换的时候,目标类型的取值范围要小于源类型,而int类型的取值范围正是-2147483648 ∼ \sim 2147483647,所以这里加了句限制条件。

简单运算

描述

输入两个正整数a和b,输出这两个正整数的和,差,积,商,模(若a>b则输出a-b,a/b,a%b的值反之输出b-a,b/a,b%a的值,不考虑小数,请使用int类型)

输入描述:

两个正整数

输出描述:

它们的和,差,积,商,模。每个值之间用空格隔开

示例1

输入:

10 5

输出:

15 5 50 2 0

内心想法:

最开始的想法是用if...else语句,但既然都想到这个了,就自然会想到之前学C++时冒泡算法中用到的创建个temp交换a和b的思想,还有三目运算符也能替代这个if...else的过程。

代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        scanner.close();
        if(a < b){
            int temp = b;
            b = a;
            a = temp;
        }
        System.out.println(a+b+" "+(a-b)+" "+(a*b)+" "+(a/b)+" "+(a%b));
      
    }
}

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        scanner.close();
        System.out.println((a+b)+" "+(a>b?a-b:b-a)+" "+a*b+" "+(a>b?a/b:b/a)+" "+(a>b?a%b:b%a));
    }
}

收获:

我们看到给出的代码中有这样一条语句:

scanner.close();

这里用到了close方法。这个方法的作用就是关闭System.in ,为什么要关闭呢,因为System.in在被第一次声明时会打开InputStream,而输入流是非常占据内存的,为此我们通常为了节省内存考虑会选择调用scanner.close()来关闭输入流,从而节省内存。如果没有关闭,那么在方法结束后,Scanner对象虽然会进入被回收的队列中,但不是立刻回收,会造成一定的内存占据,所以至少在方法结束前应调用close方法。

值得注意的是,System.in在被关闭后并不能重新打开,所以如果要关闭System.in的话一定要确保在同一方法下接下来不会再调用Scanner来接受输入。

四舍五入

描述

定义一个int类型变量i,i为由浮点数变量d四舍五入后的整数类型,请将转换后的i进行输出

输入描述:

用户随机输入的浮点数

输出描述:

四舍五入之后的整数(小数点后一位>=5则进一,否则舍去)

示例1

输入:

14.99

输出:

15

内心想法:

第一下想到之前C++的floor(x+0.5) ,想着改成Math.floor(x+0.5) ,没想到出现了俩问题,虽然不妨碍通过。

代码实现:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double d= scanner.nextDouble();
        int i = (int)Math.round(d);

        System.out.println(i);
    }
}

收获:

上面代码可以看到并没用到前面说的Math.floor(x+0.5) ,因为四舍五入的函数都被人家封装好了(小丑.jpg),直接调用这个round方法就可以了。另外还发现一点,这里跟C++不同,Java中将高级类型数据直接赋给低级类型数据是会出现编译错误的,在编译器中也会直接报错,要显式地进行数据类型转换。可以想象到round方法的具体实现就是用int i = (int)(d+0.5) 这一关键语句。

交换变量值

描述

在不使用第三个变量的情况下交换两个int类型变量的值

输入描述:

a变量和b变量的值

输出描述:

交换后a变量和b变量的值,中间用空格隔开

示例1

输入:

1 2

输出:

2 1

内心想法:

确实一下子呆住了,因为习惯用临时变量了,只能想想有没有新方法,思路方向就是要么想个妙一点的数学方法,没办法就往位运算符那边走。很遗憾的是…我两边都想出来了(Doge)。

代码实现:

法一:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        a = a + b;
        b = a - b;
        a = a - b;
        System.out.println(a+" "+b);
    }
}

法二:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        a ^= b;
        b ^= a;
        a ^= b;
        System.out.println(a+" "+b);
    }
}

收获:

其实上面说的两个方法本质上都是一个方法,因为思路是一样的(虽然位运算执行会快一点),只是法二是在二进制的基础上操作。收获就是这俩算法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lum0s!

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值