记录一下5道Java笔试算法题

以下逻辑题,用Java编程语言,并尽量考虑时间和空间优化

1、实现以下2个接口不能使用语言的基本分割组合函数(如Java的String.split,php的explode和implode)

(1)字符串拆分成数组,如“ab&&2”通过”&&“做分隔符,分割得到字符串数组[“b”,“2”]

public static List<String> splitString(String s, String delim) {
   
    List<String> res = new ArrayList<>();
    int start = 0;
    for (int i = 0; i < s.length(); i++) {
   
        if (i + delim.length() <= s.length() && s.substring(i, i + delim.length()).equals(delim)) {
   
            res.add(s.substring(start, i));
            start = i + delim.length();
        }
    }
    res.add(s.substring(start));
    return res;
}

示例

System.out.println(splitString("ab&&2", "&&")); // ["ab", "2"]
System.out.println(splitString("hello world", " ")); // ["hello", "world"]
System.out.println(splitString("hello||world||java", "||")); // ["hello", "world", "java"]
System.out.println(splitString("abcde", "||")); // ["abcde"]
java笔试算法 目录 :envelope: 说明 项目介绍 该文档主要是笔主在学习 Java 的过程中的一些学习笔记,但是为了能够涉及到大部分后端学习所需的技术知识点我也会偶尔引用一些别人的优秀文章的链接。文档大部分内容都是笔者参考书籍以及自己的原创。少部分面试题回答参考了其他人已有答案,上面都已注明。 该文档涉及的主要内容包括: Java、 数据结构与算法、计算机网络与数据通信、 操作系统、主流框架、数据存储、架构、面试必备知识点等等。相信不论你是前端还是后端都能在这份文档中收获到东西。 关于转载 如果需要引用到本仓库的一些东西,必须注明转载地址!!!毕竟大多都是手敲的,或者引用的是我的原创文章,希望大家尊重一下作者的劳动:grinning_face_with_big_eyes::grinning_face_with_big_eyes::grinning_face_with_big_eyes:! 如何对该开源文档进行贡献 笔记内容大多是手敲,所以难免会有笔误,你可以帮我找错别字。 很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。 现有的知识点难免存在不完善或者错误,所以你可以对已有知识点的修改/补充。 为什么要做这个开源文档? 在我们学习Java的时候,很多人会面临我不知继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫:grinning_face_with_smiling_eyes:)。所以,我决定通
<think>好的,我现在需要帮助用户找到最新的Java笔试算法题及其参考答案。首先,用户提到了参考引用中的一些内容,比如Lombok工作原理、哈希表实现两数之和、二分查找、顺丰的笔试算法题等。这些可能都是用户关心的点,我需要结合这些信息来生成相关的问题和答案。 首先,我需要确认用户的需求是寻找最新的题目和答案,而给出的引用中有一些例子,比如两数之和、二分查找、递归方法等。可能用户希望了解常见的算法题型以及如何解答它们。同时,用户提供的引用4提到了2024.8.29的顺丰笔试题目,这可能暗示用户需要较新的题目,但实际中可能没有那么多公开的最新资料,所以可能需要基于常见的题型来整理。 接下来,我需要考虑如何组织这些内容。根据用户提供的示例,问题需要分成几个部分,每个问题有答案,并且答案需要引用相关的引用内容。例如,两数之和的问题可以引用引用3中的代码,二分查找同样引用引用3,动态规划或递归的问题可以引用引用4中的内容。 同时,用户要求使用中文回答,并且数学表达式需要使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。需要确保生成的答案符合这些格式要求,比如在解释时间复杂度时,可能需要用到Big O表示法,例如$O(n)$或$O(n \log n)$。 另外,用户提到需要生成相关问题,这可能是在回答之后添加相关问题部分,如示例中的“相关问题”列表。需要确保生成的问题与内容相关,并且能够帮助用户进一步学习。 现在,我需要检查每个引用内容,看看哪些算法题可以被提取出来。引用3提到了两数之和的哈希表实现和二分查找搜索插入位置,引用4提到了递归和动态规划的应用,比如排列问题。引用2中的代码片段可能涉及输入处理,但具体算法不明确。引用1中的Lombok可能不太相关,但用户提到的是算法题,所以可能主要参考引用3和4。 接下来,我需要将这些算法题整理成问题,并给出参考答案,同时引用对应的引用。例如,第一个问题可以是两数之和,使用哈希表实现,答案中引用引用3的代码。第二个问题可能是二分查找的变种,比如搜索插入位置,同样引用引用3。第三个问题可能涉及递归和动态规划,比如排列问题,引用引用4中的explore方法。 还需要注意代码的正确性,例如在Java中处理数组、哈希表的使用,以及递归终止条件等。同时,在解释时间复杂度时,要使用正确的数学表达式,比如$O(n)$或$O(n^2)$,并确保LaTeX格式正确。 可能还需要考虑用户提到的“最新”笔试题目,但由于实际中最新题目可能不易获取,可以结合常见的近期题型,比如动态规划、回溯、树结构等。例如,顺丰的题目可能涉及排列组合,使用递归和缓存优化,这可能是一个状态压缩的动态规划问题,可以详细解释其思路。 在生成答案时,每个问题需要结构清晰,分步骤说明解决思路,代码部分用代码块表示,并正确引用来源。同时,在相关问题部分,提出与每个算法题相关的扩展问题,帮助用户深入理解。 最后,需要确保所有内容符合用户的要求,包括格式、引用、中文回答等,并避免任何Markdown格式错误,比如代码块的正确使用,引用标识的正确添加等。</think>### 最新Java笔试算法题及参考答案 #### 1. 两数之和(哈希表实现) **题目**: 在整数数组中找到两个数,使其和等于目标值,返回它们的下标。 **参考答案**: ```java public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[]{map.get(complement), i}; } map.put(nums[i], i); } return null; } ``` **解析**: - 时间复杂度为$O(n)$,空间复杂度为$O(n)$[^3]。 - 核心思路:利用哈希表记录已遍历元素的值与索引,实现$O(1)$时间复杂度的查找。 --- #### 2. 搜索插入位置(二分查找) **题目**: 给定有序数组和一个目标值,若目标值存在则返回其索引,否则返回应插入的位置。 **参考答案**: ```java public int searchInsert(int[] nums, int target) { int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else right = mid - 1; } return left; } ``` **解析**: - 时间复杂度为$O(\log n)$,空间复杂度为$O(1)$[^3]。 - 循环终止时,`left`指向第一个大于目标值的位置,即为插入点。 --- #### 3. 有效排列数(递归+动态规划) **题目**: 给定元素集合和连接规则,计算满足条件的所有排列数[^4]。 **参考答案**: ```java // 假设元素可连接的规则由外部函数 isConnectable 定义 public int countValidPermutations(int[] elements) { int size = elements.length; return explore(elements, new boolean[size], 0, -1, new HashMap<>()); } private int explore(int[] elements, boolean[] used, int depth, int last, Map<String, Integer> cache) { if (depth == elements.length) return 1; String key = last + "_" + depth; if (cache.containsKey(key)) return cache.get(key); int count = 0; for (int i = 0; i < elements.length; i++) { if (!used[i] && (last == -1 || isConnectable(elements[last], elements[i]))) { used[i] = true; count += explore(elements, used, depth + 1, i, cache); used[i] = false; } } if (last != -1) cache.put(key, count); return count; } ``` **解析**: - **递归终止条件**: 当`depth`等于数组长度时,说明生成了一个有效排列[^4]。 - **缓存优化**: 通过`Map`缓存中间结果,避免重复计算,时间复杂度从$O(n!)$优化至$O(n^2 \cdot 2^n)$。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值