欢迎光临
我们一直在努力

华为OD机试新系统真题【终端设备档位差异统计】

终端设备档位差异统计(C/C++/Py/Java/Js/Go)题解

华为OD机试新系统真题 华为OD上机考试新系统真题 6月24号 100分题型

华为OD机试新系统真题目录点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解

题目内容

在进行手机、平板、穿戴等设备的系统调优时,会为不同设备采集一组性能与能耗综合档位值;为了分析产品矩阵中是否存在稳定的档位梯度,工程师需要统计所有 “档位差异恰好为指定值” 的档位组合数量。 给定一个整数数组

p

r

o

f

i

l

e

s

profiles

profiles,其中

p

r

o

f

i

l

e

s

[

i

]

profiles[i]

profiles[i] 表示第

i

i

i 台终端设备的综合档位值;再给定一个非负整数

d

i

f

f

diff

diff,表示目标档位差。 请你返回不同档位值组成的组合数量,使得两个档位值的绝对差等于

d

i

f

f

diff

diff。

注意:

  • 只按档位值去重,不按设备下标计数。 例如

    p

    r

    o

    f

    i

    l

    e

    s

    =

    [

    1

    ,

    1

    ,

    3

    ,

    3

    ]

    profiles = [1,1,3,3]

    profiles=[1,1,3,3],

    d

    i

    f

    f

    =

    2

    diff=2

    diff=2 时,只能计为一组

    (

    1

    ,

    3

    )

    (1,3)

    (1,3)。

  • 当

    d

    i

    f

    f

    =

    0

    diff=0

    diff=0 时,只有某个档位值出现至少两次,才可以形成一组。

  • 约束条件:

    • 1

      ≤

      1 \\le

      1≤

      p

      r

      o

      f

      i

      l

      e

      s

      .

      s

      i

      z

      e

      (

      )

      profiles.size()

      profiles.size()

      ≤

      100000

      \\le 100000

      ≤100000

    • −

      2147483648

      ≤

      -2147483648 \\le

      −2147483648≤

      p

      r

      o

      f

      i

      l

      e

      s

      [

      i

      ]

      profiles[i]

      profiles[i]

      ≤

      2147483647

      \\le 2147483647

      ≤2147483647

    • 0

      ≤

      d

      i

      f

      f

      ≤

      2147483647

      0 \\le diff \\le 2147483647

      0≤diff≤2147483647

    样例1

    输入

    1,5,3,4,2
    2

    输出

    3

    说明 满足要求的不同档位组合为

    (

    1

    ,

    3

    )

    (1, 3)

    (1,3)、

    (

    3

    ,

    5

    )

    (3, 5)

    (3,5)、

    (

    2

    ,

    4

    )

    (2, 4)

    (2,4),共

    3

    3

    3 组。

    样例2

    输入

    8,8,8,10,10,12
    0

    输出

    2

    说明 档位

    8

    8

    8 和档位

    10

    10

    10 都至少出现两次,可以分别形成一组差值为

    0

    0

    0 的组合;档位

    12

    12

    12 只出现一次,不能形成组合。

    样例3

    输入

    -5,-3,-1,1
    2

    输出

    3

    说明 满足要求的组合为

    (

    −

    5

    ,

    −

    3

    )

    (-5, -3)

    (−5,−3)、

    (

    −

    3

    ,

    −

    1

    )

    (-3, -1)

    (−3,−1)、

    (

    −

    1

    ,

    1

    )

    (-1, 1)

    (−1,1)。

    题解

    思路:逻辑分析

  • 可以根据diff不同值的情况分别进行处理
    • diff==0: 统计所有设备值中值出现大于等于两次的数量。
    • diff != 0: 去所有设置值进行去重之后,遍历去重后的值,判断v + diff是否存在,存在即结果+1即可。
  • 对于支持哈希表/集合的语言,上述实现非常简单。对于不支持的语言,可以采用排序+利用顺序遍历实现,具体实现可参照下面C语言代码。
  • C++

    #include<bits/stdc++.h>
    #include <unordered_map>
    #include <vector>
    using namespace std;

    // 通用 切割函数 函数 将字符串str根据delimiter进行切割
    vector<int> split(const string& str, const string& delimiter) {
    vector<int> result;
    size_t start = 0;
    size_t end = str.find(delimiter);
    while (end != string::npos) {
    result.push_back(stoi(str.substr(start, end – start)));
    start = end + delimiter.length();
    end = str.find(delimiter, start);
    }
    // 添加最后一个部分
    result.push_back(stoi(str.substr(start)));
    return result;
    }

    int countProfileDiff(vector<int>& profiles, int diff) {
    if (diff == 0) {
    unordered_map<long, int> numCount;
    for (auto& profile : profiles) {
    numCount[profile]++;
    }
    int res = 0;
    // 统计次数超过1次的数量
    for (auto& p : numCount) {
    if (p.second > 1) {
    res++;
    }
    }
    return res;
    }
    int res = 0;

    unordered_set<long> s(profiles.begin(), profiles.end());
    for (auto num : s) {
    if (s.count(num + diff)) {
    res++;
    }
    }
    return res;
    }

    int main() {
    string input;
    int diff;
    getline(cin, input);
    cin >> diff;
    vector<int> profiles = split(input, ",");
    cout << countProfileDiff(profiles, diff);
    return 0;
    }

    Java

    import java.io.*;
    import java.util.*;

    public class Main {

    static int countProfileDiff(int[] profiles, int diff) {

    if (diff == 0) {
    Map<Long, Integer> numCount = new HashMap<>();

    for (int profile : profiles) {
    numCount.put((long) profile,
    numCount.getOrDefault((long) profile, 0) + 1);
    }

    int res = 0;

    // 统计次数超过1次的数量
    for (int cnt : numCount.values()) {
    if (cnt > 1) {
    res++;
    }
    }

    return res;
    }

    int res = 0;

    Set<Long> set = new HashSet<>();

    for (int profile : profiles) {
    set.add((long) profile);
    }

    for (long num : set) {
    if (set.contains(num + diff)) {
    res++;
    }
    }

    return res;
    }

    public static void main(String[] args) throws Exception {

    BufferedReader br = new BufferedReader(
    new InputStreamReader(System.in));

    String input = br.readLine();
    int diff = Integer.parseInt(br.readLine());

    String[] parts = input.split(",");

    int[] profiles = new int[parts.length];

    for (int i = 0; i < parts.length; i++) {
    profiles[i] = Integer.parseInt(parts[i]);
    }

    System.out.println(countProfileDiff(profiles, diff));
    }
    }

    Python

    from collections import Counter

    def count_profile_diff(profiles, diff):

    if diff == 0:
    num_count = Counter(profiles)

    res = 0

    # 统计次数超过1次的数量
    for cnt in num_count.values():
    if cnt > 1:
    res += 1

    return res

    res = 0

    s = set(profiles)

    for num in s:
    if num + diff in s:
    res += 1

    return res

    profiles = list(map(int, input().split(",")))
    diff = int(input())

    print(count_profile_diff(profiles, diff))

    JavaScript

    const readline = require("readline");

    const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
    });

    const lines = [];

    rl.on("line", line => {
    lines.push(line);
    });

    rl.on("close", () => {

    const profiles = lines[0].split(",").map(Number);
    const diff = Number(lines[1]);

    function countProfileDiff(profiles, diff) {

    if (diff === 0) {

    const numCount = new Map();

    for (const profile of profiles) {
    numCount.set(
    profile,
    (numCount.get(profile) || 0) + 1
    );
    }

    let res = 0;

    // 统计次数超过1次的数量
    for (const cnt of numCount.values()) {
    if (cnt > 1) {
    res++;
    }
    }

    return res;
    }

    let res = 0;

    const s = new Set(profiles);

    for (const num of s) {
    if (s.has(num + diff)) {
    res++;
    }
    }

    return res;
    }

    console.log(countProfileDiff(profiles, diff));
    });

    Go

    package main

    import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
    )

    func countProfileDiff(profiles []int, diff int) int {

    if diff == 0 {

    numCount := make(map[int]int)

    for _, profile := range profiles {
    numCount[profile]++
    }

    res := 0

    // 统计次数超过1次的数量
    for _, cnt := range numCount {
    if cnt > 1 {
    res++
    }
    }

    return res
    }

    res := 0

    s := make(map[int]bool)

    for _, profile := range profiles {
    s[profile] = true
    }

    for num := range s {
    if s[num+diff] {
    res++
    }
    }

    return res
    }

    func main() {

    reader := bufio.NewReader(os.Stdin)

    line, _ := reader.ReadString('\\n')
    line = strings.TrimSpace(line)

    diffLine, _ := reader.ReadString('\\n')
    diffLine = strings.TrimSpace(diffLine)

    diff, _ := strconv.Atoi(diffLine)

    parts := strings.Split(line, ",")

    profiles := make([]int, len(parts))

    for i, part := range parts {
    profiles[i], _ = strconv.Atoi(part)
    }

    fmt.Println(countProfileDiff(profiles, diff))
    }

    C语言

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define MAXN 100000

    // qsort比较函数(升序)
    int cmp(const void *a, const void *b) {
    int x = *(const int *)a;
    int y = *(const int *)b;

    if (x < y) return –1;
    if (x > y) return 1;
    return 0;
    }

    int countProfileDiff(int profiles[], int n, int diff) {
    // 先升序排序
    qsort(profiles, n, sizeof(int), cmp);

    int res = 0;
    long nums[MAXN];
    // 已经访问过去重的数量
    int len = 0;
    // 当前遍历元素数量
    int index = 0;
    for (int i = 0; i < n; i++) {
    long val = (long)profiles[i] – (long)diff;
    while (index < len && nums[index] < val) {
    index++;
    }

    if (index < len && nums[index] == val) {
    res++;
    // 只能进行一次组合
    index++;
    }
    // 将当前元素添加到nums中,注意去重
    if ((len == 0 || nums[len – 1] != (long) profiles[i])) {
    nums[len++] = (long) profiles[i];
    }
    }

    return res;
    }

    int main() {

    char input[10000000];

    fgets(input, sizeof(input), stdin);

    input[strcspn(input, "\\n")] = '\\0';

    int diff;
    scanf("%d", &diff);

    int profiles[MAXN];
    int n = 0;

    char *token = strtok(input, ",");

    while (token != NULL) {
    profiles[n++] = atoi(token);
    token = strtok(NULL, ",");
    }

    printf("%d\\n", countProfileDiff(profiles, n, diff));

    return 0;
    }

    赞(0)
    未经允许不得转载:171主机测评 » 华为OD机试新系统真题【终端设备档位差异统计】
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址