算法笔记

异或解法解决单双问题

  • 解决是非问题
python 复制代码
def findUnpaired(cards):
    result = 0
    for card in cards:
        result ^= card
    return result

# 测试
cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
print(findUnpaired(cards))  # 输出: 4
js 复制代码
function findUnpaired(cards) {
    let result = 0;
    for (let card of cards) {
        result ^= card;
    }
    return result;
}

// 测试
const cards = [1, 1, 2, 2, 3, 3, 4, 5, 5];
console.log(findUnpaired(cards));  // 输出: 4

遍历处理格式化字符串问题

  • 解决格式化问题
js 复制代码
如处理千位数分割情况:
三步走:
分割整数和小数
python:使用split分割,用'.' + 小数 if len(小数) > 1 else ''处理小数
JS:同理spit和三元
去掉前导0
python:使用lstrip处理前面的字符串
JS:正则去掉
处理千位数
python:使用enumerate([::-1])处理三位数并反转
JS:遍历索引添加

其中enumerate把迭代对象进行索引处理,::-1反转顺序

动态规划处理分组选择,约束满足问题

  • 解决最终的方案选择问题
js 复制代码
问题:
-   **输入**: 1到9的9个数字,被随机分成若干组(至少1组),以数组形式给出,例如 [123, 456, 789] 表示分成3组。

-   **操作**: 从每组中任意取一个数字,组成一个新数字。例如,从 [123, 456, 789] 中可以组成 147(取1、4、7)。

-   **条件**: 新数字的各位数字之和必须是偶数。例如 147 的和是 1+4+7=12,是偶数。

-   **目标**: 计算满足条件的组合总数。

动态规划:数字的奇数偶数规律,奇数个数为偶数,和为偶数
dp[i][0]表示前i组组成和为偶数的方案数
dp[i][1]表示组成和为奇数的方案数
-   转移方程:

    -   当前组有 odd 个奇数,even 个偶数。
    -   dp[i][0] = dp[i-1][0] * even + dp[i-1][1] * odd (和为偶数的情况)
    -   dp[i][1] = dp[i-1][0] * odd + dp[i-1][1] * even (和为奇数的情况)

-   初始状态:dp[0][0] = 1, dp[0][1] = 0(空组合和为0,偶数)。

最终答案:dp[n][0]
function countEvenSumCombinations(arr) {
    let evenCount = 1; // 和为偶数的方案数
    let oddCount = 0;  // 和为奇数的方案数
    
    for (let group of arr) {
        let groupStr = group.toString();
        let odds = 0;
        let evens = 0;
        // 统计当前组的奇数和偶数个数
        for (let digit of groupStr) {
            if (parseInt(digit) % 2 === 0) {
                evens++;
            } else {
                odds++;
            }
        }
        // 更新奇偶性方案数
        let newEven = evenCount * evens + oddCount * odds;
        let newOdd = evenCount * odds + oddCount * evens;
        evenCount = newEven;
        oddCount = newOdd;
    }
    
    return evenCount;
}

// 测试
const arr = [123, 456, 789];
console.log(countEvenSumCombinations(arr));
相关推荐
mjhcsp11 分钟前
C++ KMP 算法:原理、实现与应用全解析
java·c++·算法·kmp
lizhongxuan12 分钟前
Manus: 上下文工程的最佳实践
算法·架构
CS创新实验室24 分钟前
《计算机网络》深入学:海明距离与海明码
计算机网络·算法·海明距离·海明编码
WW_千谷山4_sch26 分钟前
MYOJ_10599:CSP初赛题单10:计算机网络
c++·计算机网络·算法
YuTaoShao1 小时前
【LeetCode 每日一题】1458. 两个子序列的最大点积——(解法三)状态压缩
算法·leetcode·职场和发展
位东风1 小时前
希尔排序(Shell Sort)详解
算法·排序算法
AI科技星1 小时前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹1 小时前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划