【2024华为OD-E卷-200分-数值同化】(题目+思路+Java&C++&Python解析)

题目描述

题目名称:数值同化

题目背景: 在一个数值同化过程中,你需要将一组数值进行特定的处理,使得它们能够“同化”到一个目标值附近。具体做法是,给定一个数组 nums 和一个目标值 target,你需要对数组中的每个元素进行操作,使得数组中的所有元素都尽可能接近 target。

输入

  • nums:一个包含整数的数组,表示需要进行同化的数值。
  • target:一个整数,表示同化目标值。

输出

  • 返回同化后的数组,数组中的每个元素都是经过处理后尽可能接近 target 的值。同化规则如下:
    1. 如果 nums[i] < target,则同化后的值为 nums[i] + diff,其中 diff 是 target 与 nums[i] 的差值的一半(向上取整)。
    2. 如果 nums[i] >= target,则同化后的值为 nums[i] 减去 diff,其中 diff 是 target 与 nums[i] 差值的一半(向下取整)。

示例

输入:nums = [1, 3, 5, 7], target = 4
输出:[3, 4, 4, 5]
解释:
1 < 4,同化后为 1 + (4 - 1) // 2 + 1 = 3
3 < 4,同化后为 3 + (4 - 3) // 2 + 0 = 4
5 >= 4,同化后为 5 - (5 - 4) // 2 = 4
7 >= 4,同化后为 7 - (7 - 4) // 2 = 5

思路

  1. 遍历数组:我们需要遍历数组中的每个元素。
  2. 计算差值:对于每个元素,计算它与目标值的差值。
  3. 同化规则
    • 如果当前元素小于目标值,则增加差值的一半(向上取整)。
    • 如果当前元素大于等于目标值,则减少差值的一半(向下取整)。
  4. 存储结果:将同化后的值存储在新的数组中,并返回该数组。

Java 代码解析

import java.util.Arrays;

public class NumericalAssimilation {
    public static int[] assimilate(int[] nums, int target) {
        int[] result = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            int diff = Math.abs(nums[i] - target);
            if (nums[i] < target) {
                result[i] = nums[i] + (diff + 1) / 2; // 向上取整
            } else {
                result[i] = nums[i] - diff / 2; // 向下取整
            }
        }
        return result;
    }

    public static void main(String[] args) {
        int[] nums = {1, 3, 5, 7};
        int target = 4;
        int[] assimilated = assimilate(nums, target);
        System.out.println(Arrays.toString(assimilated)); // 输出:[3, 4, 4, 5]
    }
}

C++ 代码解析

#include
#include
#include

std::vector assimilate(const std::vector& nums, int target) {
    std::vector result(nums.size());
    for (size_t i = 0; i < nums.size(); ++i) {
        int diff = std::abs(nums[i] - target);
        if (nums[i] < target) {
            result[i] = nums[i] + (diff + 1) / 2; // 向上取整
        } else {
            result[i] = nums[i] - diff / 2; // 向下取整
        }
    }
    return result;
}

int main() {
    std::vector nums = {1, 3, 5, 7};
    int target = 4;
    std::vector assimilated = assimilate(nums, target);
    for (int num : assimilated) {
        std::cout << num << " ";
    }
    // 输出:3 4 4 5
    return 0;
}

Python 代码解析

def assimilate(nums, target):
    result = []
    for num in nums:
        diff = abs(num - target)
        if num < target:
            result.append(num + (diff + 1) // 2)  # 向上取整
        else:
            result.append(num - diff // 2)  # 向下取整
    return result

nums = [1, 3, 5, 7]
target = 4
assimilated = assimilate(nums, target)
print(assimilated)  # 输出:[3, 4, 4, 5]

你可能感兴趣的:(算法,数据结构,华为od,华为)