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);
}
}