其他的选择和多选不允许跳出
另外还有一道关于数据库查询的题:
有两个表,一个学生表,一个成绩表包含学生各个科目的成绩,学生表根据学生id和成绩表关联,要求的是通过两个表联查,得到每个学生的总成绩,并根据总成绩得到学生的评级,分为A、B、C、D、E
需要用到
等
好像评测系统用的是mysql5.X的版本,在自己电脑数据库查询语句没有问题,不知道为什么复制到评测系统出现一些bug,没有时间改这个bug了,直接跳过了
题解
这道题的解决方式暂时只能想到通过HashMap
映射对应字符的按键以及按键次数,在初始化的时候初始化一个HashMap
,其中key
是对应的字符,value
是一个两位的整型数字,十位表示的是哪个按键,个位表示按键次数
这样直接遍历要处理的字符串,得到对应的按键和按键次数,累加每个按键的次数
为了去除没有按键的结果,将有按键的结果存放在ArrayList
中,然后再将其转换为int[][]
数组返回即可
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Solution {
static String[] keys = new String[]{"@!./", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
static Map<Character, Integer> map = new HashMap<>();
static{
for (int i = 1; i <= 9; i++) {
char[] chars = keys[i-1].toCharArray();
for (int j = 0; j < chars.length; j++) {
map.put(chars[j], i*10+j+1);
}
}
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 数字键按从小到大输出
* @param str string字符串 包含英文26个字母和@!./标点符号的字符串
* @return int整型二维数组
*/
public int[][] count (String str) {
// write code here
int[] res = new int[10];
char[] chars = str.toCharArray();
for (int i = 0; i<chars.length; i++) {
int temp = map.get(chars[i]);
int key = temp/10;
int cnt = temp%10;
res[key] += cnt;
}
List<int[]> res2 = new ArrayList<int[]>();
for (int i = 1; i<=9; i++) {
if (res[i] != 0) {
int[] temp = new int[]{i, res[i]};
res2.add(temp);
}
}
int[][] ans2 = new int[res2.size()][2];
for (int i = 0; i < res2.size(); i++) {
ans2[i][0] = res2.get(i)[0];
ans2[i][1] = res2.get(i)[1];
}
return ans2;
}
}
通过全部测试案例,AC成功
这道题是典型的双指针,虽然说是双指针,但是感觉也像是暴力循环和模拟了
假设城管目前处于第 i 栋楼,那么他可以看到的楼顶除了当前第 i 栋楼,尽可能有两种情况:
向前看,也就是(0, i-1),从第 i-1 栋楼开始,设置指针 left 指向向前看的楼,设置一个之前最高楼层的高度 leftmax,初始为0
向前看则表示left--
向后看和向前看基本类似,同样设置一个向后看的指针 right,向后看之前最高楼层的高度 rightmax,初始也为零,不过向后看是 right++
import java.util.Arrays;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 采用单调递减栈,栈顶元素最小,因为前面楼层低,不会挡住后面;前面高,才会挡住后面,栈顶是最接近当前位置的楼,所以要最小,代表此时栈顶所在位置向某一方向能看到其它楼的楼顶。
* @param heights int整型一维数组 n座楼的楼层高度
* @return int整型一维数组
*/
public int[] findBuilding (int[] heights) {
int n = heights.length;
int[] ans = new int[n];
Arrays.fill(ans, 1);
for (int i = 0; i < n; i++) {
int left = i-1, right = i+1;
int leftmax = 0, rightmax = 0;
while(left >= 0) {
if (heights[left] > leftmax) {
leftmax = heights[left];
ans[i]++;
}
left--;
}
while(right < n) {
if (heights[right] > rightmax) {
rightmax = heights[right];
ans[i]++;
}
right++;
}
}
return ans;
}
}
通过所有测试案例,AC成功
个人博客网站更新的更加频繁一点,其他相关的笔试和面试的笔记可以查看我的个人博客网站:madao33’s blog