今日学习之计算机学习心得

65 阅读3分钟

今日问题解答: 小U是一位古生物学家,正在研究不同物种之间的血缘关系。为了分析两种古生物的血缘远近,她需要比较它们的DNA序列。DNA由四种核苷酸A、C、G、T组成,并且可能通过三种方式发生变异:添加一个核苷酸、删除一个核苷酸或替换一个核苷酸。小U认为两条DNA序列之间的最小变异次数可以反映它们之间的血缘关系:变异次数越少,血缘关系越近。 你的任务是编写一个算法,帮助小U计算两条DNA序列之间所需的最小变异次数 主要代码如下:

    // 创建一个二维数组 dp,大小为 (m+1) x (n+1)
    int[][] dp = new int[m + 1][n + 1];
    
    // 初始化 dp 数组
    for (int i = 0; i <= m; i++) {
        dp[i][0] = i; // 如果 dna2 为空,变异次数为 dna1 的长度
    }
    for (int j = 0; j <= n; j++) {
        dp[0][j] = j; // 如果 dna1 为空,变异次数为 dna2 的长度
    }
    
    // 填充 dp 数组
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (dna1.charAt(i - 1) == dna2.charAt(j - 1)) {
                dp[i][j] = dp[i - 1][j - 1]; // 不需要变异
            } else {
                // 选择插入、删除、替换中的最小值
                dp[i][j] = Math.min(dp[i][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j - 1])) + 1;
            }
        }
    }
    
    // 返回最终结果
    return dp[m][n];
}

public static void main(String[] args) {
    // 测试用例
    System.out.println(solution("AGT", "AGCT") == 1);
    System.out.println(solution("AACCGGTT", "AACCTTGG") == 4);
    System.out.println(solution("ACGT", "TGC") == 3);
    System.out.println(solution("A", "T") == 1);
    System.out.println(solution("GGGG", "TTTT") == 4);
}

此次代码是将生活实际中的问题以及科技等等和代码编程计算联系起来,不仅仅是题如此,更有以后要应用代码时,实际项目和实习是将理论知识应用于实践的重要途径。通过参与实际项目,我们能够真正学到书本上没有的知识和经验,提高自己的实践能力和解决问题的能力。同时,实践也能让我们认识到自己的不足,明确努力的方向。此外,交流与合作也是非常重要的。学习过程中,与老师、同学交流合作可以解决疑惑、加深对知识点的理解,提高学习效率。在每一次的实践过程中不断地拓宽自己的视野,学习到不同的思维方式和解决问题的方法。与此同时,我明确还应该注重培养良好的学习习惯。制定合理的学习计划、保持良好的作息时间、养成做笔记的习惯等,积极主动的提高学习效率,保持学习的动力。总之,在这段过程的学习中,我知道了在计算机行业的学习是一个永无止境的过程,要不断挑战自我,适应行业的发展变化。相信只要我们保持学习的热情和毅力,注重实践、交流与合作,培养良好的学习习惯,让我们在计算机学习的道路上勇敢前行,为自己的未来创造更多的可能。