本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
话不多说, 直接开刷~~ 今日题目选自蓝桥杯中的两道题.
卡片
题目描述:
解题思路:
(1) 这道题我们可以使用哈希的思想, 将每个数字一共有多少张卡片给记录下来. 接下来每当出现一个数字, 就将这个数字对应卡片的数量减1.
(2) 从1开始拼, 所以我们可以先把要累加的值设为1, 接下来就分为两种思路: 一是对这个需要判断每一位的数字, 每次进行%10来拆分这个数字; 二是将这个数字转成一共字符串, 再将这个字符串拆分成一个字符数组, 然后遍历这个字符数组即可. 本人建议使用第二种方法, 好想也好写. char[] str = String.valueOf(number).toCharArray()
实现代码:
public class Main {
public static void main(String[] args) {
int[] numbers = new int[10];
for(int i = 0; i < 10; i++){
numbers[i] = 2021;
}
int number = 1;
boolean flag = true;
while(flag){
//将整数先转字符串后再转字符数组
char[] str = String.valueOf(number).toCharArray();
for(int i = 0; i < str.length; i++){
if(numbers[str[i]-'0'] > 0){
numbers[str[i]-'0']--;
}else{
flag = false;
break;
}
}
if(flag){
number++;
}
}
System.out.println(number-1);
}
}
直线
题目描述:
解题思路:
(1) 这道题属于是数学题了, 写起来会比较复杂.
(2) 我们可以先使用一个集合(这里用顺序表)来将平面 20X21 个整点给存储起来. 其中集合中的每个元素都是Map类型, 用来存储点的坐标(这样不会出现重复点的情况).
(3) 接下来进行计算斜率k和系数b, 在此之前, 需要先从集合中获取两个点, 然后将这两个点计算出来的k和b通过Map存储到Set当中, 当出现与Set中相同的值的时候, 就不会进行存储.
(4) 需要注意的是, 在(3)中我们是不考虑水平和垂直的直线, 因为在平面中是会包含很多两点连成同一条水平或垂直的直线, 将这些情况抛出出去最后再直接加上可以提高效率.
实现代码:
public class Main {
public static void main(String[] args) {
//存储所有的k和b
Set<Map<Double, Double>> lines = new HashSet<>();
//存储所有点的集合
List<Map<Integer, Integer>> points=new ArrayList<>();
for(int i = 0; i < 20; i++){
for(int j = 0; j < 21; j++){
Map<Integer, Integer> temp = new HashMap<>();
temp.put(i, j);
points.add(temp);
}
}
//计算斜率
for(int i = 0; i < points.size(); i++){
for(int j = i + 1; j < points.size(); j++){
//先获取两点的坐标
double x1 = 0;
double y1 = 0;
double x2 = 0;
double y2 = 0;
for(Map.Entry<Integer, Integer> entry : points.get(i).entrySet()){
x1 = entry.getKey();
y1 = entry.getValue();
}
for(Map.Entry<Integer, Integer> entry : points.get(j).entrySet()){
x2 = entry.getKey();
y2 = entry.getValue();
}
//先不考虑水平或者垂直的直线
if(x1 == x2 || y1 == y2){
continue;
}
//开始计算斜率
double k = (y2 - y1)/(x2 - x1);
double b = (x2*y1 - x1*y2)/(x2 - x1);
Map<Double, Double> temp = new HashMap<>();
temp.put(k, b);
lines.add(temp);
}
}
System.out.println(lines.size() + 20 + 21);
}
}