终端设备档位差异统计(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==0: 统计所有设备值中值出现大于等于两次的数量。
- diff != 0: 去所有设置值进行去重之后,遍历去重后的值,判断v + diff是否存在,存在即结果+1即可。
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;
}
实现100%通过率-171主机测评](https://www.171host.com/wp-content/uploads/2026/10/20261026191216-6adfa61015a7f-220x80.gif)
实现100%通过率-171主机测评](https://www.171host.com/wp-content/uploads/2026/10/20261026130223-6adf4f5f34184-220x80.gif)
