[img]https://i-blog.csdnimg.cn/direct/91
82
42
775f684d62
8b7dcf2
ee74eb48c.png[/img]
一、问题描述
题目描述
对一个数据a进行分类,分类方法为࿱
a;
此数据a(四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效范例,其范例为取模的值࿱
b;如果得到的结果大于或者等于c,则数据a为无效范例。
比如一个数据a=
;0x01
01
01
01
,b=
;3
,按照分类方法计算(0x01
+
;0x01
+
;0x01
+
;0x01
)%3
=
;1
,
所以如果c=
;2
,则此a为有效范例,其范例为1
,如果c=
;1
,则此a为无效范例࿱
b;
又比如一个数据a=
;0x01
01
01
03
,b=
;3
,按照分类方法计算(0x01
+
;0x01
+
;0x01
+
;0x03
)%3
=
;0,
所以如果c=
;2
,则此a为有效范例,其范例为0,如果c=
;0,则此a为无效范例。
输入1
2
个数据,第一个数据为c,第二个数据为b,剩余1
0个数据为需要分类的数据,
请找到有效范例中包含数据最多的范例,并输出该范例含有多少个数据。
输入描述
输入1
2
个数据,用空格分隔,第一个数据为c,第二个数据为b,剩余1
0个数据为需要分类的数据。
输出描述
输出最多数据的有效范例有多少个数据。
用例
[size=3
]用例1
输入
- 3
- 4 2
- 56 2
- 57 2
- 58 2
- 59 2
- 60 2
- 61
- 2
- 62
- 2
- 63
- 2
- 64 2
- 65
复制代码 输出
阐明
1
0个数据4个字节相加后的结果分别为1
2
3
4 5 6 7 8 9 1
0,
故对4取模的结果为1
2
3
0 1
2
3
0 1
2
,c为3
,所以0 1
2
都是有效范例,范例为1
和2
的有3
个数据,范例为0的只有2
个数据,故输出3
。
[size=3
]用例2
输入
- 1
- 4 2
- 56 2
- 57 2
- 58 2
- 59 2
- 60 2
- 61
- 2
- 62
- 2
- 63
- 2
- 64 2
- 65
复制代码 输出
阐明
1
0个数据4个字节相加后的结果分别为1
2
3
4 5 6 7 8 9 1
0,
故对4取模的结果为1
2
3
0 1
2
3
0 1
2
,c为1
,
所以只有0是有效范例,范例为0的有2
个数据,故输出2
。
题目剖析
[size=3
]考察点
考察基本的逻辑处理和数据分类。
[size=3
]剖析思路
[list=1
]
读取输入࿱
a;
- 读取第一个数据c和第二个数据b。
- 读取剩余的1
0个数据,这些数据需要进行分类。
分类处理࿱
a;
- 对于每个数据,将其转换为四个字节,并计算这四个字节的和。
- 对这个和对b取模,得到的结果即为该数据的范例。
- 检查这个范例是否小于c,如果是,则该数据为有效范例。
统计有效范例࿱
a;
- 使用一个字典或数组来记录每个有效范例的出现次数。
- 遍历全部数据,更新每个有效范例的计数。
找到最多数据的有效范例࿱
a;
- 遍历记录有效范例出现次数的字典或数组,找到出现次数最多的有效范例。
- 输出这个范例的数据个数。
[size=3
]留意事项
- 数据处理࿱
a;确保准确处理每个数据的四个字节,计算字节和时要留意数据范例转换。
- 范例判断࿱
a;准确判断每个数据的范例是否有效,即是否小于c。
- 统计方法࿱
a;使用符合的数据结构(如字典或数组)来统计每个有效范例的出现次数,确保统计过程的服从。
- 输出结果࿱
a;输出最多数据的有效范例的数据个数,留意处理多个范例出现次数相同的情况。
二、JavaScript算法源码
以下是 JavaScript 代码的详细中文解释和讲解࿱
a;
[size=3
]JavaScript 代码
- /* JavaScript Node ACM模式 控制台输入获取 */const readline =
- ; require(
- 4;readline
- 4;);// 创建 readline 接口,用于从控制台读取输入const rl =
- ; readline.createInterface({ input: process.stdin, // 输入流 output: process.stdout, // 输出流});// 监听每一行输入rl.on(
- 4;line
- 4;, (line) =
- ;> { // 将输入行按空格分割为数组 let arr =
- ; line.split(
- 4; 
- 4;); // 提取数组中的第一个元素作为 c,并将其转换为数字 const c =
- ; arr.shift() - 0; // 提取数组中的第二个元素作为 b,并将其转换为数字 const b =
- ; arr.shift() - 0; // 调用 getResult 函数并输出结果 console.log(getResult(arr, c, b));});/** * 计算满足条件的范例数量 * @param arr 输入的数组 * @param c 范例上限 * @param b 模数 * @return 返回满足条件的范例数量的最大值 */function getResult(arr, c, b) { // 使用对象 count 记录每种范例的数量 const count =
- ; {}; arr .map((a) =
- ;> { // 将数组中的每个元素转换为十六进制字符串 let str =
- ; Number(a).toString(1
- 6); // 如果十六进制字符串长度为奇数,前面补零 if (str.length % 2
- !=
- ;=
- ; 0) { str =
- ; 
- 4;0
- 4; +
- ; str; } // 计算十六进制字符串每两位的和 let sum =
- ; 0; for (let i =
- ; 0; i < str.length - 1
- ; i +
- ;=
- ; 2
- ) { sum +
- ;=
- ; parseInt(str.slice(i, i +
- ; 2
- ), 1
- 6); } // 计算 sum 模 b 的余数,作为范例 const type =
- ; sum % b; // 如果范例小于 c,返回范例࿱
- b;否则返回 -1
- if (type < c) { return type; } else { return -1
- ; } }) .forEach((type) =
- ;> { // 如果范例不为 -1
- ,记录该范例的数量 if (type !=
- ;=
- ; -1
- ) { count[type] ? count[type]+
- ;+
- ; : (count[type] =
- ; 1
- ); } }); // 返回 count 对象中值的最大值 return Object.values(count).sort((a, b) =
- ;> b - a)[0];}
复制代码 [size=3
]详细讲解
[size=2
]1
. 输入处理
- const readline =
- ; require(
- 4;readline
- 4;);const rl =
- ; readline.createInterface({ input: process.stdin, output: process.stdout,});rl.on(
- 4;line
- 4;, (line) =
- ;> { let arr =
- ; line.split(
- 4; 
- 4;); const c =
- ; arr.shift() - 0; const b =
- ; arr.shift() - 0; console.log(getResult(arr, c, b));});
复制代码
- 功能࿱
a;
- 使用 readline 模块从控制台读取输入。
- 每读取一行输入,将其按空格分割为数组 arr。
- 提取数组中的前两个元素作为 c 和 b,并将其转换为数字。
- 调用 getResult 函数并输出结果。
[size=2
]2
. 核心函数 getResult
- function getResult(arr, c, b) { const count =
- ; {}; arr .map((a) =
- ;> { let str =
- ; Number(a).toString(1
- 6); if (str.length % 2
- !=
- ;=
- ; 0) { str =
- ; 
- 4;0
- 4; +
- ; str; } let sum =
- ; 0; for (let i =
- ; 0; i < str.length - 1
- ; i +
- ;=
- ; 2
- ) { sum +
- ;=
- ; parseInt(str.slice(i, i +
- ; 2
- ), 1
- 6); } const type =
- ; sum % b; if (type < c) { return type; } else { return -1
- ; } }) .forEach((type) =
- ;> { if (type !=
- ;=
- ; -1
- ) { count[type] ? count[type]+
- ;+
- ; : (count[type] =
- ; 1
- ); } }); return Object.values(count).sort((a, b) =
- ;> b - a)[0];}
复制代码
- 功能࿱
a;
- 算法逻辑࿱
a;[list=1
]
- 使用对象 count 记录每种范例的数量。
- 遍历数组 arr,对每个元素进行以下操作࿱
a;
- 将其转换为十六进制字符串。
- 如果字符串长度为奇数,前面补零。
- 计算每两位的和 sum。
- 计算 sum 模 b 的余数 type。
- 如果 type 小于 c,返回 type࿱
b;否则返回 -1
。
- 遍历结果数组,记录每种范例的数量。
- 返回 count 对象中值的最大值。
[size=3
]代码运行示例
[size=2
]示例 1
࿱
a;
输入࿱
a;
输出࿱
a;
解释࿱
a;
- 对于 1
0࿱
a;
- 十六进制为 a,补零后为 0a。
- 和为 0 +
; 1
0 =
; 1
0。
- 范例为 1
0 % 5 =
; 0。
- 对于 2
0࿱
a;
- 十六进制为 1
4。
- 和为 1
+
; 4 =
; 5。
- 范例为 5 % 5 =
; 0。
- 对于 3
0࿱
a;
- 十六进制为 1
e。
- 和为 1
+
; 1
4 =
; 1
5。
- 范例为 1
5 % 5 =
; 0。
- 范例 0 的数量为 3
,但 c =
; 3
,所以最大值为 3
。
[size=2
]示例 2
࿱
a;
输入࿱
a;
输出࿱
a;
解释࿱
a;
- 对于 5࿱
a;
- 十六进制为 5,补零后为 05。
- 和为 0 +
; 5 =
; 5。
- 范例为 5 % 4 =
; 1
。
- 对于 1
5࿱
a;
- 十六进制为 f,补零后为 0f。
- 和为 0 +
; 1
5 =
; 1
5。
- 范例为 1
5 % 4 =
; 3
。
- 范例 1
和 3
的数量均为 1
,最大值为 1
。
[size=3
]总结
[list=1
]
功能࿱
a;
优点࿱
a;
- 使用十六进制转换和模运算快速计算范例。
- 使用对象记录范例数量,方便统计。
实用场景࿱
a;
如果您有其他问题,欢迎随时提问!
;
三、Java算法源码
以下是 Java 代码的详细中文解释和讲解࿱
a;
[size=3
]Java 代码
- import java.util.Arrays;import java.util.HashMap;import java.util.Scanner;public class Main { // 输入获取 public static void main(String[] args) { Scanner sc =
- ; new Scanner(System.in); // 读取输入的两个整数 c 和 b int c =
- ; sc.nextInt(); int b =
- ; sc.nextInt(); // 读取输入的数组 arr,固定长度为 1
- 0 int[] arr =
- ; new int[1
- 0]; for (int i =
- ; 0; i < 1
- 0; i+
- ;+
- ;) arr[i] =
- ; sc.nextInt(); // 调用 getResult 函数并输出结果 System.out.println(getResult(c, b, arr)); } // 算法入口 public static int getResult(int c, int b, int[] arr) { // 使用 HashMap 记录每种范例的数量 HashMap<Integer, Integer> count =
- ; new HashMap<>(); // 对数组 arr 中的每个元素进行处理 Arrays.stream(arr) .map( a -> { // 将整数 a 转换为十六进制字符串 String str =
- ; Integer.toHexString(a); // 如果十六进制字符串长度为奇数,前面补零 if (str.length() % 2
- !=
- ; 0) { str =
- ; 
- 4;0
- 4; +
- ; str; } // 计算十六进制字符串每两位的和 int sum =
- ; 0; for (int i =
- ; 0; i < str.length() - 1
- ; i +
- ;=
- ; 2
- ) { sum +
- ;=
- ; Integer.parseInt(str.substring(i, i +
- ; 2
- ), 1
- 6); } // 计算 sum 模 b 的余数,作为范例 int t =
- ; sum % b; // 如果范例小于 c,返回范例࿱
- b;否则返回 -1
- if (t < c) { return t; } else { return -1
- ; } }) .forEach( t -> { // 如果范例不为 -1
- ,记录该范例的数量 if (t !=
- ; -1
- ) { count.put(t, count.getOrDefault(t, 0) +
- ; 1
- ); } }); // 返回 count 中值的最大值,如果没有满足条件的范例,返回 0 return count.values().stream().max((x, y) -> x - y).orElse(0); }}
复制代码 [size=3
]详细讲解
[size=2
]1
. 输入处理
- public static void main(String[] args) { Scanner sc =
- ; new Scanner(System.in); // 读取输入的两个整数 c 和 b int c =
- ; sc.nextInt(); int b =
- ; sc.nextInt(); // 读取输入的数组 arr,固定长度为 1
- 0 int[] arr =
- ; new int[1
- 0]; for (int i =
- ; 0; i < 1
- 0; i+
- ;+
- ;) arr[i] =
- ; sc.nextInt(); // 调用 getResult 函数并输出结果 System.out.println(getResult(c, b, arr));}
复制代码
- 功能࿱
a;
- 使用 Scanner 从控制台读取输入。
- 读取两个整数 c 和 b。
- 读取长度为 1
0 的数组 arr。
- 调用 getResult 函数并输出结果。
[size=2
]2
. 核心函数 getResult
- public static int getResult(int c, int b, int[] arr) { // 使用 HashMap 记录每种范例的数量 HashMap<Integer, Integer> count =
- ; new HashMap<>(); // 对数组 arr 中的每个元素进行处理 Arrays.stream(arr) .map( a -> { // 将整数 a 转换为十六进制字符串 String str =
- ; Integer.toHexString(a); // 如果十六进制字符串长度为奇数,前面补零 if (str.length() % 2
- !=
- ; 0) { str =
- ; 
- 4;0
- 4; +
- ; str; } // 计算十六进制字符串每两位的和 int sum =
- ; 0; for (int i =
- ; 0; i < str.length() - 1
- ; i +
- ;=
- ; 2
- ) { sum +
- ;=
- ; Integer.parseInt(str.substring(i, i +
- ; 2
- ), 1
- 6); } // 计算 sum 模 b 的余数,作为范例 int t =
- ; sum % b; // 如果范例小于 c,返回范例࿱
- b;否则返回 -1
- if (t < c) { return t; } else { return -1
- ; } }) .forEach( t -> { // 如果范例不为 -1
- ,记录该范例的数量 if (t !=
- ; -1
- ) { count.put(t, count.getOrDefault(t, 0) +
- ; 1
- ); } }); // 返回 count 中值的最大值,如果没有满足条件的范例,返回 0 return count.values().stream().max((x, y) -> x - y).orElse(0);}
复制代码
- 功能࿱
a;
- 算法逻辑࿱
a;[list=1
]
- 使用 HashMap 记录每种范例的数量。
- 遍历数组 arr,对每个元素进行以下操作࿱
a;
- 将其转换为十六进制字符串。
- 如果字符串长度为奇数,前面补零。
- 计算每两位的和 sum。
- 计算 sum 模 b 的余数 t。
- 如果 t 小于 c,返回 t࿱
b;否则返回 -1
。
- 遍历结果数组,记录每种范例的数量。
- 返回 count 中值的最大值,如果没有满足条件的范例,返回 0。
[size=3
]代码运行示例
[size=2
]示例 1
࿱
a;
输入࿱
a;
- 3
- 51
- 0 2
- 0 3
- 0 40 50 60 70 80 90 1
- 00
复制代码 输出࿱
a;
解释࿱
a;
- 对于 1
0࿱
a;
- 十六进制为 a,补零后为 0a。
- 和为 0 +
; 1
0 =
; 1
0。
- 范例为 1
0 % 5 =
; 0。
- 对于 2
0࿱
a;
- 十六进制为 1
4。
- 和为 1
+
; 4 =
; 5。
- 范例为 5 % 5 =
; 0。
- 对于 3
0࿱
a;
- 十六进制为 1
e。
- 和为 1
+
; 1
4 =
; 1
5。
- 范例为 1
5 % 5 =
; 0。
- 范例 0 的数量为 3
,最大值为 3
。
[size=2
]示例 2
࿱
a;
输入࿱
a;
- 2
- 45 1
- 5 2
- 5 3
- 5 45 55 65 75 85 95
复制代码 输出࿱
a;
解释࿱
a;
- 对于 5࿱
a;
- 十六进制为 5,补零后为 05。
- 和为 0 +
; 5 =
; 5。
- 范例为 5 % 4 =
; 1
。
- 对于 1
5࿱
a;
- 十六进制为 f,补零后为 0f。
- 和为 0 +
; 1
5 =
; 1
5。
- 范例为 1
5 % 4 =
; 3
。
- 范例 1
和 3
的数量均为 1
,最大值为 1
。
[size=3
]总结
[list=1
]
功能࿱
a;
优点࿱
a;
- 使用十六进制转换和模运算快速计算范例。
- 使用 HashMap 记录范例数量,方便统计。
实用场景࿱
a;
如果您有其他问题,欢迎随时提问!
;
四、Python算法源码
以下是 Python 代码的详细中文解释和讲解࿱
a;
[size=3
]Python 代码
[size=3
]详细讲解
[size=2
]1
. 输入处理
- tmp =
- ; list(map(int, input().split())) # 读取一行输入,按空格分割并转换为整数列表c =
- ; tmp[0] # 提取第一个元素作为 cb =
- ; tmp[1
- ] # 提取第二个元素作为 barr =
- ; tmp[2
- :] # 提取剩余元素作为数组 arr
复制代码
- 功能࿱
a;
- 使用 input().split() 读取一行输入,按空格分割为字符串列表。
- 使用 map(int, ...) 将字符串列表转换为整数列表 tmp。
- 提取 tmp 中的前两个元素作为 c 和 b。
- 提取剩余元素作为数组 arr。
[size=2
]2
. 核心函数 classify
- def classify(a): # 将整数 a 转换为十六进制字符串,并去除 
- 9;0x
- 9; 前缀 s =
- ; hex(a)[2
- :] # 如果十六进制字符串长度为奇数,前面补零 if len(s) % 2
- !=
- ; 0: s =
- ; 
- 4;0
- 4; +
- ; s # 计算十六进制字符串每两位的和 sumV =
- ; 0 for i in range(0, len(s) - 1
- , 2
- ): sumV +
- ;=
- ; int(s[i:i +
- ; 2
- ], 1
- 6) # 计算 sumV 模 b 的余数,作为范例 t =
- ; sumV % b # 如果范例小于 c,返回范例࿱
- b;否则返回 -1
- if t < c: return t else: return -1
复制代码
- 功能࿱
a;
- 算法逻辑࿱
a;[list=1
]
- 将整数 a 转换为十六进制字符串,并去除 0x 前缀。
- 如果字符串长度为奇数,前面补零。
- 计算每两位的和 sumV。
- 计算 sumV 模 b 的余数 t。
- 如果 t 小于 c,返回 t࿱
b;否则返回 -1
。
[size=2
]3
. 核心函数 getResult
- def getResult(): # 使用字典 count 记录每种范例的数量 count =
- ; {} # 对数组 arr 中的每个元素调用 classify 函数,得到范例 t for t in map(classify, arr): # 如果范例 t 不为 -1
- ,记录该范例的数量 if t !=
- ; -1
- : if count.get(t) is None: count[t] =
- ; 1
- else: count[t] +
- ;=
- ; 1
- # 返回 count 中值的最大值 return max(count.values())
复制代码
- 功能࿱
a;
- 算法逻辑࿱
a;[list=1
]
- 使用字典 count 记录每种范例的数量。
- 遍历数组 arr,对每个元素调用 classify 函数,得到范例 t。
- 如果范例 t 不为 -1
,记录该范例的数量。
- 返回 count 中值的最大值。
[size=2
]4. 算法调用
[size=3
]代码运行示例
[size=2
]示例 1
࿱
a;
输入࿱
a;
- 3
- 5 1
- 0 2
- 0 3
- 0 40 50 60 70 80 90 1
- 00
复制代码 输出࿱
a;
解释࿱
a;
- 对于 1
0࿱
a;
- 十六进制为 a,补零后为 0a。
- 和为 0 +
; 1
0 =
; 1
0。
- 范例为 1
0 % 5 =
; 0。
- 对于 2
0࿱
a;
- 十六进制为 1
4。
- 和为 1
+
; 4 =
; 5。
- 范例为 5 % 5 =
; 0。
- 对于 3
0࿱
a;
- 十六进制为 1
e。
- 和为 1
+
; 1
4 =
; 1
5。
- 范例为 1
5 % 5 =
; 0。
- 范例 0 的数量为 3
,最大值为 3
。
[size=2
]示例 2
࿱
a;
输入࿱
a;
- 2
- 4 5 1
- 5 2
- 5 3
- 5 45 55 65 75 85 95
复制代码 输出࿱
a;
解释࿱
a;
- 对于 5࿱
a;
- 十六进制为 5,补零后为 05。
- 和为 0 +
; 5 =
; 5。
- 范例为 5 % 4 =
; 1
。
- 对于 1
5࿱
a;
- 十六进制为 f,补零后为 0f。
- 和为 0 +
; 1
5 =
; 1
5。
- 范例为 1
5 % 4 =
; 3
。
- 范例 1
和 3
的数量均为 1
,最大值为 1
。
[size=3
]总结
[list=1
]
功能࿱
a;
优点࿱
a;
- 使用十六进制转换和模运算快速计算范例。
- 使用字典记录范例数量,方便统计。
实用场景࿱
a;
如果您有其他问题,欢迎随时提问!
;
五、C/C+
;+
;算法源码࿱
a;
以下是 C+
;+
; 和 C 语言的代码实现,包含详细的中文解释和讲解࿱
a;
[size=3
]C+
;+
; 代码
- #include <iostream>#include <vector>#include <map>#include <algorithm>using namespace std;// 判断是否有效int classify(int a, int b, int c) { // 将整数 a 转换为十六进制字符串 char hexStr[2
- 0]; sprintf(hexStr, 
- 4;%x
- 4;, a); // 使用 sprintf 将整数转换为十六进制字符串 string s =
- ; hexStr; // 如果十六进制字符串长度为奇数,前面补零 if (s.length() % 2
- !=
- ; 0) { s =
- ; 
- 4;0
- 4; +
- ; s; } // 计算十六进制字符串每两位的和 int sumV =
- ; 0; for (int i =
- ; 0; i < s.length() - 1
- ; i +
- ;=
- ; 2
- ) { string sub =
- ; s.substr(i, 2
- ); // 提取两位十六进制字符 sumV +
- ;=
- ; stoi(sub, nullptr, 1
- 6); // 将十六进制字符串转换为整数并累加 } // 计算 sumV 模 b 的余数,作为范例 int t =
- ; sumV % b; // 如果范例小于 c,返回范例࿱
- b;否则返回 -1
- if (t < c) { return t; } else { return -1
- ; }}// 算法入口int getResult(vector<int>& arr, int b, int c) { map<int, int> count; // 使用 map 记录每种范例的数量 // 对数组 arr 中的每个元素调用 classify 函数,得到范例 t for (int a : arr) { int t =
- ; classify(a, b, c); // 如果范例 t 不为 -1
- ,记录该范例的数量 if (t !=
- ; -1
- ) { count[t]+
- ;+
- ;; } } // 返回 count 中值的最大值 int maxCount =
- ; 0; for (auto& pair : count) { if (pair.second > maxCount) { maxCount =
- ; pair.second; } } return maxCount;}int main() { // 输入获取 vector<int> tmp; int num; while (cin >> num) { tmp.push_back(num); } int c =
- ; tmp[0]; // 提取第一个元素作为 c int b =
- ; tmp[1
- ]; // 提取第二个元素作为 b vector<int> arr(tmp.begin() +
- ; 2
- , tmp.end()); // 提取剩余元素作为数组 arr // 算法调用 cout << getResult(arr, b, c) << endl;
- return 0;}
复制代码 [size=3
]C 语言代码
- #include <stdio.h>#include <stdlib.h>#include <string.h>// 判断是否有效int classify(int a, int b, int c) { // 将整数 a 转换为十六进制字符串 char hexStr[2
- 0]; sprintf(hexStr, 
- 4;%x
- 4;, a); // 使用 sprintf 将整数转换为十六进制字符串 // 如果十六进制字符串长度为奇数,前面补零 if (strlen(hexStr) % 2
- !=
- ; 0) { memmove(hexStr +
- ; 1
- , hexStr, strlen(hexStr) +
- ; 1
- ); // 右移一位 hexStr[0] =
- ; 
- 9;0
- 9;; // 补零 } // 计算十六进制字符串每两位的和 int sumV =
- ; 0; for (int i =
- ; 0; i < strlen(hexStr) - 1
- ; i +
- ;=
- ; 2
- ) { char sub[3
- ]; strncpy(sub, hexStr +
- ; i, 2
- ); // 提取两位十六进制字符 sub[2
- ] =
- ; 
- 9;\0
- 9;; // 添加字符串结束符 sumV +
- ;=
- ; (int)strtol(sub, NULL, 1
- 6); // 将十六进制字符串转换为整数并累加 } // 计算 sumV 模 b 的余数,作为范例 int t =
- ; sumV % b; // 如果范例小于 c,返回范例࿱
- b;否则返回 -1
- if (t < c) { return t; } else { return -1
- ; }}// 算法入口int getResult(int* arr, int n, int b, int c) { int count[1
- 00] =
- ; {0}; // 使用数组记录每种范例的数量,假设范例不凌驾 1
- 00 // 对数组 arr 中的每个元素调用 classify 函数,得到范例 t for (int i =
- ; 0; i < n; i+
- ;+
- ;) { int t =
- ; classify(arr[i], b, c); // 如果范例 t 不为 -1
- ,记录该范例的数量 if (t !=
- ; -1
- ) { count[t]+
- ;+
- ;; } } // 返回 count 中值的最大值 int maxCount =
- ; 0; for (int i =
- ; 0; i < 1
- 00; i+
- ;+
- ;) { if (count[i] > maxCount) { maxCount =
- ; count[i]; } } return maxCount;}int main() { // 输入获取 int tmp[1
- 00]; int n =
- ; 0; while (scanf(
- 4;%d
- 4;, &tmp[n]) !=
- ; EOF) { n+
- ;+
- ;; } int c =
- ; tmp[0]; // 提取第一个元素作为 c int b =
- ; tmp[1
- ]; // 提取第二个元素作为 b int arr[1
- 00]; for (int i =
- ; 2
- ; i < n; i+
- ;+
- ;) { arr[i - 2
- ] =
- ; tmp[i]; // 提取剩余元素作为数组 arr } // 算法调用 printf(
- 4;%d\n
- 4;, getResult(arr, n - 2
- , b, c)); return 0;}
复制代码 [size=3
]详细讲解
[size=2
]1
. 输入处理
- C+
;+
;࿱
a;
- vector<int> tmp;int num;while (cin >> num) { tmp.push_back(num);}int c =
- ; tmp[0];int b =
- ; tmp[1
- ];vector<int> arr(tmp.begin() +
- ; 2
- , tmp.end());
复制代码
- 使用 vector 动态存储输入数据。
- 提取前两个元素作为 c 和 b,剩余元素作为数组 arr。
- C࿱
a;
- int tmp[1
- 00];int n =
- ; 0;while (scanf(
- 4;%d
- 4;, &tmp[n]) !=
- ; EOF) { n+
- ;+
- ;;}int c =
- ; tmp[0];int b =
- ; tmp[1
- ];int arr[1
- 00];for (int i =
- ; 2
- ; i < n; i+
- ;+
- ;) { arr[i - 2
- ] =
- ; tmp[i];}
复制代码
- 使用固定大小的数组 tmp 存储输入数据。
- 提取前两个元素作为 c 和 b,剩余元素作为数组 arr。
[size=2
]2
. 核心函数 classify
- C+
;+
;࿱
a;
- int classify(int a, int b, int c) { char hexStr[2
- 0]; sprintf(hexStr, 
- 4;%x
- 4;, a); string s =
- ; hexStr; if (s.length() % 2
- !=
- ; 0) { s =
- ; 
- 4;0
- 4; +
- ; s; } int sumV =
- ; 0; for (int i =
- ; 0; i < s.length() - 1
- ; i +
- ;=
- ; 2
- ) { string sub =
- ; s.substr(i, 2
- ); sumV +
- ;=
- ; stoi(sub, nullptr, 1
- 6); } int t =
- ; sumV % b; if (t < c) { return t; } else { return -1
- ; }}
复制代码
- 将整数 a 转换为十六进制字符串。
- 如果字符串长度为奇数,前面补零。
- 计算每两位的和 sumV。
- 计算 sumV 模 b 的余数 t。
- 如果 t 小于 c,返回 t࿱
b;否则返回 -1
。
- C࿱
a;
- int classify(int a, int b, int c) { char hexStr[2
- 0]; sprintf(hexStr, 
- 4;%x
- 4;, a); if (strlen(hexStr) % 2
- !=
- ; 0) { memmove(hexStr +
- ; 1
- , hexStr, strlen(hexStr) +
- ; 1
- ); hexStr[0] =
- ; 
- 9;0
- 9;; } int sumV =
- ; 0; for (int i =
- ; 0; i < strlen(hexStr) - 1
- ; i +
- ;=
- ; 2
- ) { char sub[3
- ]; strncpy(sub, hexStr +
- ; i, 2
- ); sub[2
- ] =
- ; 
- 9;\0
- 9;; sumV +
- ;=
- ; (int)strtol(sub, NULL, 1
- 6); } int t =
- ; sumV % b; if (t < c) { return t; } else { return -1
- ; }}
复制代码
- 逻辑与 C+
;+
; 版本相同,但使用 C 标准库函数实现。
[size=2
]3
. 核心函数 getResult
- C+
;+
;࿱
a;
- int getResult(vector<int>& arr, int b, int c) { map<int, int> count; for (int a : arr) { int t =
- ; classify(a, b, c); if (t !=
- ; -1
- ) { count[t]+
- ;+
- ;; } } int maxCount =
- ; 0; for (auto& pair : count) { if (pair.second > maxCount) { maxCount =
- ; pair.second; } } return maxCount;}
复制代码
- 使用 map 记录每种范例的数量。
- 遍历数组 arr,调用 classify 函数,记录范例数量。
- 返回范例数量的最大值。
- C࿱
a;
- int getResult(int* arr, int n, int b, int c) { int count[1
- 00] =
- ; {0}; for (int i =
- ; 0; i < n; i+
- ;+
- ;) { int t =
- ; classify(arr[i], b, c); if (t !=
- ; -1
- ) { count[t]+
- ;+
- ;; } } int maxCount =
- ; 0; for (int i =
- ; 0; i < 1
- 00; i+
- ;+
- ;) { if (count[i] > maxCount) { maxCount =
- ; count[i]; } } return maxCount;}
复制代码
- 使用固定大小的数组 count 记录范例数量。
- 遍历数组 arr,调用 classify 函数,记录范例数量。
- 返回范例数量的最大值。
[size=2
]4. 算法调用
- C+
;+
;࿱
a;- cout << getResult(arr, b, c) << endl;
复制代码 - C࿱
a;- printf(
- 4;%d\n
- 4;, getResult(arr, n - 2
- , b, c));
复制代码 [size=3
]总结
[list=1
]
功能࿱
a;
优点࿱
a;
- 使用十六进制转换和模运算快速计算范例。
- 使用 map(C+
;+
;)或数组(C)记录范例数量,方便统计。
实用场景࿱
a;
如果您有其他问题,欢迎随时提问!
;
六、尾言
[size=3
]什么是华为OD࿱
f;
华为OD(Outsourcing Developer,外包开发工程师)是华为针对软件开发工程师岗位的一种招聘形式,主要包罗笔试、技能面试以及综合面试等环节。尤其在笔试部分,算法题的机试至关重要。
[size=3
]为什么刷题很重要࿱
f;
[list=1
]
机试是进入技能面的第一关࿱
a;
华为OD机试(常被称为机考)主要考察算法和编程能力。只有通过机试,才气进入后续的技能面试环节。
技能面试需要手撕代码࿱
a;
技能一面和二面通常会涉及现场编写代码或算法题。面试官会注重考察候选人的思路清晰度、代码规范性以及解决问题的能力。因此提前刷题、多训练是通过面试的重要保障。
入职后的可信测验࿱
a;
入职华为后,还需要通过“可信测验”。可信测验分为三个品级࿱
a;
- 入门级࿱
a;主要考察底子算法与编程能力。
- 工作级࿱
a;更贴近实际业务需求,可能涉及复杂的算法或与工作内容相干的场景题目。
- 专业级࿱
a;最高品级,考察深层次的算法以及优化能力,与薪资直接挂钩。
[size=3
]刷题策略与阐明࿱
a;
2
02
4年8月1
4日之后,华为OD机试的题库转为 E卷,由往年题库(D卷、A卷、B卷、C卷)和全新题目组成。刷题时可以参考以下策略࿱
a;
[list=1
]
关注积年真题࿱
a;
- 题库中的旧题占比较大,建议优先刷积年的A卷、B卷、C卷、D卷题目。
- 对于每道题目,建议深度理解其解题思路、代码实现,以及相干算法的实用场景。
适应新题目࿱
a;
- E卷中包含全新题目,需要掌握全面的算法知识和一定的灵活应对能力。
- 建议关注新的刷题平台或交流群,获取最新题目的剖析和动态。
掌握常见算法࿱
a;
华为OD测验通常涉及以下算法和数据结构࿱
a;
- 排序算法(快速排序、归并排序等)
- 动态规划(背包问题、最长公共子序列等)
- 贪心算法
- 栈、队列、链表的操作
- 图论(最短路径、最小天生树等)
- 滑动窗口、双指针算法
保持编程规范࿱
a;
- 注重代码的可读性和解释的清晰度。
- 纯熟使用常见编程语言,如C+
;+
;、Java、Python等。
[size=3
]如何获取资源࿱
f;
[list=1
]
官方参考࿱
a;
- 华为招聘官网或相干的招聘平台会有一些参考信息。
- 华为OD的相干公众号可能也会发布相干的刷题资料或学习资源。
加入刷题社区࿱
a;
- 找到可信的刷题交流群,与其他备考的小同伴交流经验。
- 关注着名的刷题网站,如LeetCode、牛客网等,这些平台上有许多华为OD的积年真题和剖析。
探求系统性的教程࿱
a;
- 学习一本经典的算法书籍,例如《算法导论》《剑指Offer》《编程之美》等。
- 完成系统的学习课程,例如数据结构与算法的在线课程。
[size=3
]积极心态与连续努力࿱
a;
刷题的过程可能会比较枯燥,但它可以或许显著提升编程能力和算法思维。无论是为了通过华为OD的招聘测验,还是为了未来的职业发展,这些积聚都会成为重要的财富。
[size=3
]测验留意细节
[list=1
]
当地编写代码
- 在当地 IDE(如 VS Code、PyCharm 等)上编写、生存和调试代码,确保逻辑准确后再复制粘贴到测验页面。这样可以淘汰语法错误,提高代码准确性。
调解心态,保持冷静
- 碰到提示不敷或实现不确定的问题时,不必慌张,可以采取更简朴或更有把握的方法替换,确保思路清晰。
输入输出完整性
- 留意训练和测验时都需要编写完整的输入输出代码,尤其是和题目示例保持同等。完成代码后务必及时调试,确保功能符合要求。
快捷键使用
- 删除行可用 Ctrl+
;D,复制、粘贴和撤销分别为 Ctrl+
;C,Ctrl+
;V,Ctrl+
;Z,这些可以正常使用。
- 制止使用 Ctrl+
;S,以免触发浏览器的生存功能。
浏览器要求
- 使用最新版的 Google Chrome 浏览器完成测验,确保摄像头开启并正常工作。测验期间不要切换到其他网站,以免影响测验结果。
交卷相干
- 答题前,务必细致检察题目示例,制止遗漏要求。
- 每完成一道题后,点击【生存并调试】按钮,多次生存和调试是答应的,系统会记录得分最高的一次结果。完玉成部题目后,点击【提交本题型】按钮。
- 确保在测验结束前提交试卷,制止因未生存或调试失误而丢分。
时间和分数安排
- 总时间࿱
a;1
50 分钟࿱
b;总分࿱
a;400 分。
- 试卷结构࿱
a;2
道一星难度题(每题 1
00 分),1
道二星难度题(2
00 分)。及格分为 1
50 分。公道分配时间,优先完成本身善于的题目。
测验环境准备
- 测验前请备好草稿纸和笔。测验中只管制止离开座位,确保监控画面正常。
- 如需上茅厕,请提前规划好时间以淘汰中途离开监控的可能性。
技能问题处理
- 如果测验中碰到断电、断网、死机等技能问题,可以关闭浏览器并重新打开试卷链接继续作答。
- 出现其他问题,请第一时间联系 HR 或监考职员进行反馈。
祝你测验顺利,取得理想结果!
;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao1
2
3
.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |