总结一下刷的一些题

65 阅读5分钟

第一题:找单独数的问题

image.png 代码如下:

public class Main {
    public static int solution(int[] cards) {
        // Edit your code here
        int a = cards[0];
        //遍历每个数进行异或处理
        for (int i = 1; i < cards.length; i++) {
            a = a ^ cards[i];
        }
        //返回处理结果
        return a;
    }

    public static void main(String[] args) {
        // Add your test cases here
        System.out.println(solution(new int[]{1, 1, 2, 2, 3, 3, 4, 5, 5}));
        System.out.println(solution(new int[]{0, 1, 0, 1, 2}));
    }
}

在面对 “找单独数的问题” 时,最初的想法是通过排序后进行两个数两个数的遍历,以找出单独出现的那个数。然而,很快意识到这样的方法无法满足题目中在 O (n) 时间复杂度内求解的要求。

当再次仔细阅读题目时,便发现了其中的捷径与妙处。由于题目中数是一对一对出现的,这一特点恰好可以利用位运算中的异或运算来解决。异或运算具有 “相同为 0,不同为 1” 的特性,若两个数相同,那么它们的二进制数也相同,两个相同数的异或结果为 0。而 0 又具有特殊性质,0 和任何一个数的异或结果为这个数本身。因此,只需要通过遍历数组,将里面的数都进行异或处理,就能够轻松得出正确答案。

这个解题过程不仅体现了对问题的深入分析和理解,还展示了灵活运用位运算解决特定问题的巧妙方法。在编程中,我们常常需要根据问题的特点选择合适的算法和数据结构,而对于一些具有特殊性质的问题,位运算等底层操作往往能发挥出意想不到的效果。通过这道题,我们也应该学会在面对问题时,多角度地思考,挖掘问题中的潜在规律,以找到更加高效的解决方案。

第二题:最少前缀操作问题

image.png 这是一个简单的题目,虽然分类为中等题目 代码如下:

public class Main {
    public static int solution(String S, String T) {
        // write code here
        int count = 0;
        int i = 0, j = 0;
        while (i < S.length()) {
            if (j >= T.length() || S.charAt(i) != T.charAt(j))
                count++;
            j++;
            i++;
        }

        return count;
    }

    public static void main(String[] args) {
        System.out.println(solution("aba", "abb") == 1);
        System.out.println(solution("abcd", "efg") == 4);
        System.out.println(solution("xyz", "xy") == 1);
        System.out.println(solution("hello", "helloworld") == 0);
        System.out.println(solution("same", "same") == 0);
    }
}

在解决这道 “最少前缀操作问题” 时,最初想到使用双循环的方法,但很快意识到可能存在更高效的解法,进而想到了数据结构中的 KMP 算法,最终调整为一个循环并在其中使用条件判断。

这种转变不仅体现了对不同算法的熟悉和灵活运用,还展示了在编程过程中不断优化的思维方式。通过巧妙地利用条件判断中的短路特性,即对于 “||”,当前面的语句为真时后面的语句不会执行;对于 “&&”,当前面的语句为假时后面的语句不会执行,有效地提高了代码的执行效率。

这道题也提醒我们,在面对问题时,不能仅仅满足于一种直观的解法,而要不断探索更优的方案。同时,对数据结构和算法的深入理解,可以帮助我们在解决问题时更加得心应手。在实际的编程工作中,我们应该时刻保持这种优化和创新的意识,以提高代码的质量和性能。

第三题:最大相等分割红包金额

image.png

代码如下:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static int solution(List<Integer> redpacks) {
        // Please write your code here
        int left = 0;
        int right = redpacks.size() - 1;
        int count = 0;
        int countleft = redpacks.get(left), countright = redpacks.get(right);
        while (left < right) {
            if (countleft < countright) {
                left++;
                countleft += redpacks.get(left);
            } else if (countleft == countright) {
                count += countleft;
                left++;
                right--;
                countleft = redpacks.get(left);
                countright = redpacks.get(right);
            } else {
                right--;
                countright += redpacks.get(right);
            }

        }

        return count;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        List<Integer> redpacks0 = new ArrayList<>();
        redpacks0.add(10);
        redpacks0.add(10);
        redpacks0.add(10);
        redpacks0.add(10);

        List<Integer> redpacks1 = new ArrayList<>();
        redpacks1.add(1);
        redpacks1.add(3);
        redpacks1.add(4);
        redpacks1.add(6);
        redpacks1.add(7);
        redpacks1.add(14);

        List<Integer> redpacks2 = new ArrayList<>();
        redpacks2.add(10000);

        List<Integer> redpacks3 = new ArrayList<>();
        redpacks3.add(52);
        redpacks3.add(13);
        redpacks3.add(61);
        redpacks3.add(64);
        redpacks3.add(42);
        redpacks3.add(26);
        redpacks3.add(4);
        redpacks3.add(27);
        redpacks3.add(25);

        List<Integer> redpacks4 = new ArrayList<>();
        redpacks4.add(2);
        redpacks4.add(5);
        redpacks4.add(50);
        redpacks4.add(30);
        redpacks4.add(60);
        redpacks4.add(52);
        redpacks4.add(26);
        redpacks4.add(5);
        redpacks4.add(74);
        redpacks4.add(83);
        redpacks4.add(34);
        redpacks4.add(96);
        redpacks4.add(6);
        redpacks4.add(88);
        redpacks4.add(94);
        redpacks4.add(80);
        redpacks4.add(64);
        redpacks4.add(22);
        redpacks4.add(97);
        redpacks4.add(47);
        redpacks4.add(46);
        redpacks4.add(25);
        redpacks4.add(24);
        redpacks4.add(43);
        redpacks4.add(76);
        redpacks4.add(24);
        redpacks4.add(2);
        redpacks4.add(42);
        redpacks4.add(51);
        redpacks4.add(96);
        redpacks4.add(97);
        redpacks4.add(87);
        redpacks4.add(47);
        redpacks4.add(93);
        redpacks4.add(11);
        redpacks4.add(98);
        redpacks4.add(41);
        redpacks4.add(54);
        redpacks4.add(18);
        redpacks4.add(16);
        redpacks4.add(11);
        redpacks4.add(96);
        redpacks4.add(34);
        redpacks4.add(36);
        redpacks4.add(87);
        redpacks4.add(24);
        redpacks4.add(32);
        redpacks4.add(27);
        redpacks4.add(62);
        redpacks4.add(72);
        redpacks4.add(54);
        redpacks4.add(14);
        redpacks4.add(67);
        redpacks4.add(5);
        redpacks4.add(21);
        redpacks4.add(20);
        redpacks4.add(44);
        redpacks4.add(55);
        redpacks4.add(3);
        redpacks4.add(82);
        redpacks4.add(19);
        redpacks4.add(45);
        redpacks4.add(1);
        redpacks4.add(52);
        redpacks4.add(14);
        redpacks4.add(44);
        redpacks4.add(46);
        redpacks4.add(39);
        redpacks4.add(83);
        redpacks4.add(27);
        redpacks4.add(30);
        redpacks4.add(87);
        redpacks4.add(61);
        redpacks4.add(56);
        redpacks4.add(59);
        redpacks4.add(10);
        redpacks4.add(83);
        redpacks4.add(80);
        redpacks4.add(42);
        redpacks4.add(44);
        redpacks4.add(75);
        redpacks4.add(39);
        redpacks4.add(43);
        redpacks4.add(41);
        redpacks4.add(23);
        redpacks4.add(93);
        redpacks4.add(73);
        redpacks4.add(50);
        redpacks4.add(94);
        redpacks4.add(94);
        redpacks4.add(82);
        redpacks4.add(46);
        redpacks4.add(87);
        redpacks4.add(60);
        redpacks4.add(94);
        redpacks4.add(47);
        redpacks4.add(52);
        redpacks4.add(67);
        redpacks4.add(22);
        redpacks4.add(50);
        redpacks4.add(49);
        redpacks4.add(8);
        redpacks4.add(9);
        redpacks4.add(30);
        redpacks4.add(62);
        redpacks4.add(87);
        redpacks4.add(13);
        redpacks4.add(11);

        System.out.println(solution(redpacks0) == 20);
        System.out.println(solution(redpacks1) == 14);
        System.out.println(solution(redpacks2) == 0);
        System.out.println(solution(redpacks3) == 52);
        System.out.println(solution(redpacks4) == 2627);
    }

}

对于这道“最大相等分割红包金额”的问题,刚开始解题的时候,我着实被题目中的样例给迷惑了。那些样例呈现出的模式在我脑海中形成了一种定式,让我误以为在整个解题过程中,只会出现当前指针所指的左边累计红包金额比右边小的情况。在这种先入为主的观念影响下,我最初设计的算法逻辑是片面的,仅仅考虑了这一种情况。 然而,当我满心欢喜地提交代码,期待着正确的结果时,却迎来了错误提示。这就像是一盆冷水浇在头上,让我瞬间清醒过来。我开始重新审视自己的思路和代码,这才意识到问题所在:我完全忽略了在后续的计算过程中,右边的红包金额累计值是有可能比左边小的。这种情况的遗漏导致我的算法在面对更复杂多样的输入数据时,无法准确地计算出最大相等分割红包金额。

这一失误让我深刻体会到,在解题时不能仅仅依赖于样例所呈现的表面信息,需要更加深入、全面地去分析问题的本质和各种可能出现的情况,否则很容易陷入思维误区,导致代码出现漏洞。