Codewars:找到奇数 int
给定一个数组,找到出现次数为奇数的整数。在数组中,总会有一个整数出现奇数次,尽管其他数字可能会出现多次。
例子:
- 输入:
findOdd([20, 1, 1, 2, 2])
输出:20
- 输入:
findOdd([5, 4, 3, 2, 1, 5, 4, 3, 2, 10, 10])
输出:1
如何使用PEDAC方法对其进行处理:
P:了解问题
我们需要识别数组中哪个数字出现奇数次。尽管每个数字可以多次出现,但只有一个数字会出现奇数次。
E:举个例子
例如,在数组 [8, 8, 7, 7, 7]
中,数字7出现了3次(奇数次),这使得它成为我们的目标。再如,在数组 [1, 1, 2]
中,数字2仅出现一次(奇数次),因此它被指定为解决方案。
D:需要什么数据结构
一个对象似乎是将每个数字映射到它在数组中出现次数的理想数据结构。
A:在没有特定语言信息的情况下解决它的步骤
首先,通过遍历数组:这使我可以单独检查每个数字。
- 如果遇到一个数字,请将其添加到数据结构:对象中。
- 检查是否曾经遇到过该数字。如果没有,请在对象中初始化其计数。如果数字已经在对象中,请增加其计数。
C:根据编码伪代码指导的解决方案
首先,遍历数组:
for (let i of A) {
// 如果遇到一个数字,将其添加到数据结构:对象中
// 检查是否曾经遇到过该数字
if (!values[i]) {
values[i] = 1; // 如果没有,初始化其计数
} else {
values[i] += 1; // 如果已经存在,增加其计数
}
}
然后,遍历对象检查计数,并返回计数为奇数的数字:
for (let k in values) {
if (values[k] % 2 === 1) {
return Number(k);
}
}
将它们整合到 findOdd
函数中:
function findOdd(A) {
let values = {};
// 首先遍历数组
for (let i of A) {
// 检查是否曾经遇到过该数字
if (!values[i]) {
values[i] = 1; // 如果没有,初始化其计数
} else {
values[i] += 1; // 如果已经存在,增加其计数
}
}
// 遍历对象,找到并返回计数为奇数的数字
for (let k in values) {
if (values[k] % 2 === 1) {
return Number(k);
}
}
}