「笔试题」最近做了一个招银网络科技Java岗位在线笔试题,给有需要的朋友了解学习一下!

这篇博客介绍了两个编程题目。第一题涉及统计字符串中每个字符出现的次数,并按字符和数量组合成新字符串,例如输入'sssdhibdhidhi',返回's3d3h3i3b1'。第二题要求找出数组中所有数字组合,使得它们的和等于目标值,例如输入'[10,1,2,7,6,1,5]'和目标8,返回可能的组合。文章通过示例代码详细解释了解题思路和递归实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程题一

大概意思是,给一段字符串,然后统计该字符串中相同字符个数,并以字符串+该字符串个数组合排列成新的字符串。如输入" sssdhibdhidhi " ,需要返回结果 "s3d3h3i3b1"。话不多说,直接上代码:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        LinkedHashMap<Character,Integer> hashMap = new LinkedHashMap<>();
        String str = "sssdhibdhidhi";
        for (char c: str.toCharArray()) {
            if (hashMap.containsKey(c)) {
                hashMap.put(c,hashMap.get(c) + 1);
            } else {
                hashMap.put(c,1);
            }
        }

        for (Character character : hashMap.keySet()) {
            System.out.printf("%s%s",character,hashMap.get(character));
        }
    }
}

编程题二

大概意思是 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次。

说明:

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。 

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

实现代码如下:


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class Main {
    public static void main(String[] args) {
        int[] candidates = {2,6,1,7,4,9};
        System.out.println(combinationSum(candidates,20));
    }
    static List<List<Integer>> lists = new ArrayList<>();
 
    public static List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        //对数组进行排序
        if (candidates == null || candidates.length == 0 || target < 0) {
            return lists;
        }
        List<Integer> list = new ArrayList<>();
        dfs(list, candidates, target, 0);
        return lists;
    }
 
    private static void dfs(List<Integer> list, int[] candidates, int target, int start) {
        //递归的终止条件
        if (target < 0) {
            return;
        }
        if (target == 0) {
            lists.add(new ArrayList<>(list));
        } else {
            for (int i = start; i < candidates.length; i++) {
                //因为这个数和上个数相同,所以从这个数开始的所有情况,在上个数里面都考虑过了,需要跳过
                if (i != start && candidates[i] == candidates[i - 1]) {
                    continue;
                }
                list.add(candidates[i]);
                dfs(list, candidates, target - candidates[i], i + 1);
                list.remove(list.size() - 1);
            }
        }
    }
}

思路说明:

以{1, 1, 2, 5, 6, 7},target = 8 为例模拟一下解题流程
首先排个序,是为了以后能方便的剪枝以及跳过重复的解

遍历数组,进行累加,若小于 8 就继续遍历,得到 [1, 1, 2]
下一个 5 添加进来后就大于 8 了,所以直接 break 这次遍历,并从列表中退出 2,然后从2的下一个元素继续遍历,得到 [1, 1, 5]
下一个 6 添加进来后大于 8,所以去掉 5,从将5 后一个元素继续得到 [1, 1, 6],判断等于 8,所以保存该解,因为已经排好了序,所以后面的元素不用再看了,就 break这次循环
这时列表中只有 [1, 1], 将第二个 1 退出,从它的后一个元素开始遍历,得到 [1, 2, 5],保存该解并break这次循环
退出2,从它的下一个元素开始,得到[1, 5]
下一个 6 添加进来后大于 8,所以去掉5,添加6,得到[1, 6]
下一个 7 添加进来后大于 8,所以去掉6,添加7,得到[1, 7],保存该解并break这次循环
退出1,从它下一个元素开始,因为下一个元素还是1,所以跳过它,再下一个元素是2,于是从2开始得到[2, 5]
下一个 6 添加进来后大于 8,所以去掉5,添加6,得到[2, 6],保存该解并break这次循环
退出2,从它下一个元素 5 开始,得到 [5]
下一个 6 添加进来后大于 8,所以去掉5,添加6,得到 [6]
下一个 7 添加进来后大于 8,所以去掉6,添加7,得到 [7]

更多笔试题持续更新中....

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

52it.club

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值