华为OD刷题C卷 - 每日刷题 15(九进制转换,寻找身高相近的小朋友)

73 篇文章 0 订阅
37 篇文章 1 订阅

1、(九进制转换):

这段代码是解决一个九进制转换的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于将一个伪装成十进制数的九进制数转换为真正的十进制数。

main方法首先读取一个伪装成十进制的长整数n,然后将其每一位拆分并存储到数组arr中。接着,调用getResult方法并打印转换后的十进制数。

getResult方法遍历数组arr,对于每一位数字,如果它大于4,则减1以修正九进制的表示错误(因为在九进制中不存在5-9的数字)。然后,根据该数字在九进制数中的位置,将其乘以相应的9的幂次方。最后,将所有修正后的数字相加得到最终的十进制数。

2、(寻找身高相近的小朋友):

这段代码是解决“寻找身高相近的小朋友”的问题。它提供了一个Java类Main,其中包含main方法和sortHeight方法,用于根据小明和其他小朋友的身高差进行排序。

main方法首先读取小明的身高h和班级中小朋友的个数n,然后读取所有小朋友的身高并存储到数组heights中。接着,调用sortHeight方法并打印排序后的结果。

sortHeight方法使用Arrays.sort对小朋友的身高进行排序。排序时,首先比较身高差的绝对值,如果两个小朋友和小明的身高差绝对值相同,则比较他们的身高。排序完成后,使用StringJoiner将排序后的身高数组拼接成一个字符串,并返回。

package OD242;

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //计费表的表面读数
        long n = sc.nextLong();
        //实际上是按九进制进位的,所以拆分
        long[] arr = Arrays.stream(String.valueOf(n).split("")).mapToLong(Long::parseLong).toArray();

        System.out.println(getResult(arr));
    }

    /**
     * 实际上是将九进制数转为十进制数
     *
     * @param arr
     * @return long
     */
    public static long getResult(long[] arr) {
        int correct = 0;

        for (int i = 0; i < arr.length; i++) {
            long fault = arr[i];
            if (fault > 4) fault--;

            //到达该位置需要经历j次 9进制
            for (int j = arr.length - i - 1; j > 0; j--) {
                fault *= 9;
            }

            correct += fault;
        }

        return correct;
    }
}
package OD247;

import java.util.*;

/**
 * @description 寻找身高相近的小朋友
 * @level 4
 * @score 100
 * @url https://hydro.ac/d/HWOD2023/p/OD247
 */

/**
 * 题目描述
 * 小明今年升学到了小学1年级来到新班级后,发现其他小朋友身高参差不齐,然后就想基于各小朋友和自己的身高差,对他们进行排序,请帮他实现排序。
 * <p>
 * 输入描述
 * 第一行为正整数 h和n,0<h<200 为小明的身高,0<n<50 为新班级其他小朋友个数。
 * <p>
 * 第二行为n个正整数,h1 ~ hn分别是其他小朋友的身高,取值范围0<hi<200,且n个正整数各不相同。
 * <p>
 * 输出描述
 * 输出排序结果,各正整数以空格分割,
 * <p>
 * 和小明身高差绝对值最小的小朋友排在前面,
 * <p>
 * 和小明身高差绝对值最大的小朋友排在后面,
 * <p>
 * 如果两个小朋友和小明身高差一样,则个子较小的小朋友排在前面。
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //小明身高
        int h = sc.nextInt();
        //小朋友个数
        int n = sc.nextInt();
        //小朋友
        Integer[] heights = new Integer[n];
        for (int i = 0; i < n; i++) {
            heights[i] = sc.nextInt();
        }
        System.out.println(sortHeight(heights, h));
    }

    //按与小明身高差的绝对值从小到大排序
    public static String sortHeight(Integer[] heights, int h) {
        //排序 要使用Integer[]才能直接做“-“法
        Arrays.sort(heights, (a, b) -> {
            //身高差的绝对值
            int absA = Math.abs(a - h);
            int absB = Math.abs(b - h);

            //绝对值升序
            if (absA != absB) return absA - absB;
                //绝对值相同,按身高排序
            else return a - b;
        });
        StringJoiner sj = new StringJoiner(" ");
        for (Integer height : heights) {
            sj.add(height + "");
        }
        return sj.toString();
    }

}
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值