Java方法和数组习题

☀️前言☀️

本篇文章主要给大家讲一下方法使用和数组的一些习题。

👦有缘,才相遇,你好!我是hgway_hxz

❤️热爱Java,希望结识更多的小伙伴一起交流

🎉欢迎大家:👍点赞 💬评论 ⭐收藏 💖关注

✉️如果有任何问题欢迎大家在评论区讨论或者私信我

✏️只有微笑才会美丽,只有奔跑才会给力

🔒1.打印X图形

原题:X形图案

描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。

输入描述:

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

输出描述:

针对每行输入,输出用“*”组成的X形图案
在这里插入图片描述

💡解题思路:

在类似二维数组的正方格中,对角线打印*,其余打印空格,发现打印 * 的横坐标和纵坐标满足两个条件

1.i == j 2. i + j == n - 1

请添加图片描述
🔑代码:

public static void printX(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j || i + j == n - 1) {
                System.out.print("*");
            } else {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNextInt()) {
        int n = scanner.nextInt();
        printX(n);
    }
}

🔒2.逆序打印正整数的每一位

💡解题思路:

采用模10除10的方法,以123为例子

123 % 10 = 3

123 / 10 = 12

12 % 10 = 2

12 / 10 = 1

1 % 10 = 1

1 / 10 = 0

🔑代码:

public static void reversePrint(int n) {
    while (n != 0) {
        System.out.print(n % 10);
        n = n / 10;
    }
}

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    reversePrint(n);
}

🔒3.找出数组中只出现一次的数字

一个数组中只有一个数字出现了一次,其余数字出现了两次,找出这个数字

💡解题思路:

采用按位异或的方法:n ^ 0 = n;n ^ n = 0,按位异或满足交换律和结合律,把数组的所有元素按位异或

13 = 0000 0000 0000 0000 0000 0000 0000 1101

0 = 0000 0000 0000 0000 0000 0000 0000 0000

13^0= 0000 0000 0000 0000 0000 0000 0000 1101 = 13

13^13= 0000 0000 0000 0000 0000 0000 0000 0000 = 0

🔑代码:

public static void main(String[] args) {
    int[] array = {1, 2, 3, 4, 5, 4, 3, 2, 1};
    int ret = 0;
    for (int i = 0; i < array.length; i++) {
        ret = ret ^ array[i];
    }
    System.out.println(ret);
}

🔒4.分别输出一个数二进制序列中的所有偶数位和奇数位

💡解题思路:

采用按位与,把这个数字的二进制&1,例如13的二进制序列为

13的二进制0000…………1101
下标31302928…………3210

我们以下标为0是奇数从右往左,而打印从左往右

13的奇数位:0000…………0011

13的偶数位:0000…………0010

🔑代码:

public static void printOne(int n) {
    //打印奇数位,奇数位下标从30到0
    for (int i = 30; i >= 0; i -= 2) {
        System.out.print((n >>> i) & 1);
    }
    System.out.println();
    //打印偶数位,偶数位下标从31到1
    for (int j = 31; j >= 1; j -= 2) {
        System.out.print((n >>> j) & 1);
    }
}

public static void main(String[] args) {
    printOne(13);
}

结果:

0000000000000011
0000000000000010
Process finished with exit code 0

🔒5.调整数组顺序使得奇数位于偶数之前,调整之后,不关心大小顺序

💡解题思路:

定义数组的第一个元素的下标为left,最后一个元素的下标为right,

如果left下标的元素为奇数就left++,找下一个元素,是偶数循环结束;right下标的元素为偶数就right–,找上一个元素,是奇数循环结束;

left和right都停下来就交换他们的元素,直到left和right相遇。
在这里插入图片描述

🔑代码:

public static void main(String[] args) {
    int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int left = 0;
    int right = array.length - 1;
    
    while (left < right) {
        while (left < right && array[left] % 2 != 0) {
            left++;
        }
        while (left < right && array[right] % 2 == 0) {
            right--;
        }
        int tmp = array[left];
        array[left] = array[right];
        array[right] = tmp;
    }
    
    for (int i = 0; i < array.length; i++) {
        System.out.print(array[i] + " ");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

那年盛夏繁如花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值