九章算法面试高频题冲刺班2022版

1.两数之和

该题目给出一个整数数组和一个目标值,要求找到数组中两个数的和等于目标值,并返回这两个数的下标。

我们可以使用哈希表来解决该问题,先遍历一遍数组,将每个数和它的下标存储到哈希表中,然后再遍历一遍数组,对于每个数,查找是否存在目标值减去该数的值在哈希表中,如果存在,返回两个数的下标即可。

以下是代码实现:

public int[] twoSum(int[] nums, int target) {

    Map<Integer, Integer> map = new HashMap<>();

    for (int i = 0; i < nums.length; i++) {

        map.put(nums[i], i);

    }

    for (int i = 0; i < nums.length; i++) {

        int complement = target - nums[i];

        if (map.containsKey(complement) && map.get(complement) != i) {

            return new int[] {i, map.get(complement)};

        }

    }

    return new int[] {};

}

2.最长回文子串

该题目给出一个字符串,要求找到其中最长的回文子串。

我们可以使用动态规划来解决该问题,定义一个二维数组dp[i][j]表示从i到j的子串是否是回文串,如果是回文串,dp[i][j]的值为true,否则为false。然后,我们遍历所有可能的子串,判断其是否是回文串,并记录最长的回文子串的长度和起始位置。

以下是代码实现:

public String longestPalindrome(String s) {

    int n = s.length();

    boolean[][] dp = new boolean[n][n];

    int start = 0, maxLen = 1;

    for (int i = 0; i < n; i++) {

        dp[i][i] = true;

    }

    for (int j = 1; j < n; j++) {

        for (int i = 0; i < j; i++) {

            if (s.charAt(i) == s.charAt(j)) {

                if (j - i <= 2) {

                    dp[i][j] = true;

                } else {

                    dp[i][j] = dp[i + 1][j - 1];

                }

            } else {

                dp[i][j] = false;

            }

            if (dp[i][j] && j - i + 1 > maxLen) {

                start = i;

                maxLen = j - i + 1;

            }

        }

    }

    return s.substring(start, start + maxLen);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容