ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

C语言/数据结构位运算实战:异或XOR找出独特英雄战斗力——计算最大胜利场次

C语言/数据结构位运算实战:异或XOR找出独特英雄战斗力——计算最大胜利场次 问题描述在英雄联盟的角斗场中有 n 位英雄准备进行决斗。每位英雄都有一个战斗力值决斗规则是战斗力值高的一方获胜战斗力值相同则平手不计入胜利次数。有趣的是除了一个英雄之外所有其他英雄的战斗力值都恰好有另一个英雄与之相同。现在角斗场主办方希望安排一位英雄作为“挑战者”这位挑战者可以与所有其他英雄依次决斗每场决斗后英雄状态会重置不影响后续决斗。主办方想知道如果选择那位战斗力值独特的英雄作为挑战者他最多能获得多少场胜利。要求设计一个算法计算独特战斗力值的英雄作为挑战者时能够获得的最大胜利次数。算法时间复杂度应为 O(n)其中 n 是英雄的数量。测试样例样例1输入powers [1, 1, 3, 5, 5, 7, 7]输出2解释独特战斗力值是3只出现一次。挑战者战斗力3依次与[1,1,5,5,7,7]决斗比1大赢比1大赢比5小输比5小输比7小输比7小输。总共获胜2场。样例2输入powers [2, 2, 4, 6, 6, 8, 8]输出2解释独特战斗力值是4只出现一次。挑战者战斗力4依次与[2,2,6,6,8,8]决斗比2大赢比2大赢比6小输比6小输比8小输比8小输。总共获胜2场。样例3输入powers [5, 10, 10, 15, 15, 20, 20]输出0解释独特战斗力值是5只出现一次。挑战者战斗力5依次与[10,10,15,15,20,20]决斗比10小输比10小输比15小输比15小输比20小输比20小输。没有战斗力值小于5的英雄所以获胜0场。约束条件3 ≤ powers.length ≤ 1001且为奇数0 ≤ powers[i] ≤ 10000除了一个英雄的战斗力值只出现一次外其余每个战斗力值都恰好出现两次挑战者必须选择那个战斗力值独特的英雄程序代码#include stdio.hint maxWins(int* powers, int powersSize) {// 1. 找出独特的战斗力值int unique 0;for (int i 0; i powersSize; i) {unique ^ powers[i];}// 2. 统计小于独特值的元素个数int wins 0;for (int i 0; i powersSize; i) {if (powers[i] unique) {wins;}}return wins;}int main() {int powers1[] {1, 1, 3, 5, 5, 7, 7};int powers2[] {2, 2, 4, 6, 6, 8, 8};int powers3[] {5, 10, 10, 15, 15, 20, 20};printf(%d\n, maxWins(powers1, 7)); // 2printf(%d\n, maxWins(powers2, 7)); // 2printf(%d\n, maxWins(powers3, 7)); // 0return 0;}#include stdio.h int maxWins(int* powers, int powersSize) { // 1. 找出独特的战斗力值 int unique 0; for (int i 0; i powersSize; i) { unique ^ powers[i]; } // 2. 统计小于独特值的元素个数 int wins 0; for (int i 0; i powersSize; i) { if (powers[i] unique) { wins; } } return wins; } int main() { int powers1[] {1, 1, 3, 5, 5, 7, 7}; int powers2[] {2, 2, 4, 6, 6, 8, 8}; int powers3[] {5, 10, 10, 15, 15, 20, 20}; printf(%d\n, maxWins(powers1, 7)); // 2 printf(%d\n, maxWins(powers2, 7)); // 2 printf(%d\n, maxWins(powers3, 7)); // 0 return 0; }运行结果
返回列表