【笔试题记录】7月25日笔试题

本文记录了两道编程题目,第一题涉及统计手机英文9键每个数字键的点击次数,通过建立哈希表实现;第二题为数组操作,要求在最多改变n个值的情况下找到最长连续0或1的子数组,采用滑动窗口方法解决。解题思路包括哈希映射和区间维护。

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

0725笔试编程题记录

记录今天笔试的最后两道编程题

题目一:

题目描述:有一个手机英文9键的表,数字键点一次表示输出第一个字母,点两次输出第二个字母,一次类推,给一个输入字符串,统计每个数字键的点击次数
手机键格式:
1:@!/. 2:abc 3:def
4:ghi 5:jkl 6:mno
7:pqrs 8:tuv 9:wxyz
解题思路:
直接就是根据手机键的字符的分布构建hash表,然后对于每一个输入直接计算最后返回结果就好

import java.util.*;
  public static  void main(String[] args){
        HashMap<Character,int[]> map = new HashMap<>();
        map.put('@',new int[]{1,1});
        map.put('!',new int[]{1,2});
        map.put('.',new int[]{1,3});
        map.put('/',new int[]{1,4});
        map.put('a',new int[]{2,1});
        map.put('b',new int[]{2,2});
        map.put('c',new int[]{2,3});
        map.put('d',new int[]{3,1});
        map.put('e',new int[]{3,2});
        map.put('f',new int[]{3,3});
        map.put('g',new int[]{4,1});
        map.put('h',new int[]{4,2});
        map.put('i',new int[]{4,3});
        map.put('j',new int[]{5,1});
        map.put('k',new int[]{5,2});
        map.put('l',new int[]{5,3});
        map.put('m',new int[]{6,1});
        map.put('n',new int[]{6,2});
        map.put('o',new int[]{6,3});
        map.put('p',new int[]{7,1});
        map.put('q',new int[]{7,2});
        map.put('r',new int[]{7,3});
        map.put('s',new int[]{7,4});
        map.put('t',new int[]{8,1});
        map.put('u',new int[]{8,2});
        map.put('v',new int[]{8,3});
        map.put('w',new int[]{9,1});
        map.put('x',new int[]{9,2});
        map.put('y',new int[]{9,3});
        map.put('z',new int[]{9,4});
        //....
        Scanner sc = new Scanner(System.in);
        String in = sc.nextLine();
        int[] count = new int[10];
        for(int i=0;i<in.length();i++) {
            char c = in.charAt(i);
            count[map.get(c)[0]] += map.get(c)[1];
        }
        List<int[]> res = new ArrayList<>();
        for(int i=1;i<=9;i++){
            if(count[i]!=0) res.add(new int[]{i,count[i]});
        }
        int[][] ans = new int[res.size()][2];
        for(int i=0;i<res.size();i++){
            ans[i] = res.get(i);
        }
        
        for(int i=0;i<ans.length;i++){
            System.out.println(ans[i][0]+" "+ans[i][1]);
        }
        //   return ans;
    }
题目二:

题目描述:一个有若干0和1组成的数组以及整数n,最多可以把n个值从0变成1或者从1变成0,返回包含1或0的最长连续子数组的长度
解题思路: 这个题目是1004. 最大连续1的个数 III,只是LeetCode原题是求最长连续1,但是这个题目有可能是求最长连续1也可能是最长连续0,核心思路就是滑动区间维护,调用两次就好了,最后比较求最长连续1和最长连续0的最大值

class solve{
    public int longestOnes(int[] nums, int k,int b) {
        int n = nums.length;
        int left = 0, lsum = 0, rsum = 0;
        int ans = 0;
        for (int right = 0; right < n; ++right) {
            rsum += Math.abs(b - nums[right]);
            while (lsum < rsum - k) {
                lsum += Math.abs(b - nums[left]);
                ++left;
            }
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }

}
public class T14 {
    public static  void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[]{0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1};
        solve s = new solve();
        int ans1  = s.longestOnes(arr,3,1);
        int ans2 = s.longestOnes(arr,3,0);
        int ans = Math.max(ans1,ans2);
        //System.out.println(ans1+" "+ans2);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值