一、蓝桥刷题情况
输入
一个整数,如果询问的两点不连通则输出-1.
样例输入
7 6
1 3
2 3
3 4
3 5
4 5
5 6
1 6
样例输出
2
思路
dfs与bfs应该都可行,就是编程实现起来比较麻烦,需要用到特殊的结构体,索引得是开始位置,值得是该位置能够抵达的位置,且能够抵达的位置可能为多个。,结构题解决以后,程序实现就还好,有较好的dfs与bfs基础。
dfs程序实现
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = scan.nextInt(), m = scan.nextInt();
HashMap<Integer, List<Integer>> map = new HashMap<>();
List<Integer> list;
for(int i = 0; i < m; i++){
int cur = scan.nextInt();
list = map.getOrDefault(cur ,new LinkedList<Integer>());
list.add(scan.nextInt());
map.put(cur,list);
}
int start = scan.nextInt(), end = scan.nextInt();
System.out.println(dfs(map, start, end));
scan.close();
}
private static int dfs(HashMap<Integer, List<Integer>> map, int cur, int end){
if(!map.containsKey(cur)) return 0;
else{
int ans = 0;
for(int num : map.get(cur)){
if(num == end) return 1;
ans += dfs(map, num, end);
}
return ans;
}
}
}
bfs程序实现
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = scan.nextInt(), m = scan.nextInt();
// map的key为开始位置,value为能够达到的位置集合。
HashMap<Integer, List<Integer>> map = new HashMap<>();
List<Integer> list;
for(int i = 0; i < m; i++){
int cur = scan.nextInt();
list = map.getOrDefault(cur ,new LinkedList<Integer>());
list.add(scan.nextInt());
map.put(cur,list);
}
int start = scan.nextInt(), end = scan.nextInt();
int ans = 0;
Queue<Integer> queue = new ArrayDeque<>();
// 把起始位置放进队列,进行bfs
queue.offer(start);
while(!queue.isEmpty()){
int cur = queue.poll();
if(map.containsKey(cur)){
for(int num : map.get(cur)){
if(num == end) ans++;
queue.offer(num);
}
}
}
// 当ans为0时,即起始位置与结束位置没有连同,返回-1。
System.out.println(ans == 0 ? -1 : ans);
scan.close();
}
}
二、leetcode刷题情况
字符串中不同整数的数目
题目描述
给你一个字符串word
,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34"
将会变成 " 123 34 8 34"
。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"
、"34"
、"8"
和 "34"
。
返回对 word
完成替换后形成的 不同 整数的数目。
只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。
输入
word = “a1b01c001”
输出
3
解释
“1”、“01” 和 “001” 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。
提示
- 1 <= word.length <= 1000
- word 由数字和小写英文字母组成
思路
模拟即可,注意前导零的存在需要额外注意,再使用HashSet去重即可。
算法实现
class Solution {
public int numDifferentIntegers(String word) {
Set<String> set = new HashSet<>();
for(int i = 0; i < word.length(); i++){
char c = word.charAt(i);
// 因为之包含数字与小写字母,题中ASCII码小于58就只有数字
if(c < 58){
int j = i;
while(j < word.length() && word.charAt(j) < 58) j++;
// 去除前导零
while(i < j && word.charAt(i) == 48) i++;
set.add(word.substring(i, j));
i = j;
}
}
return set.size();
}
}
Z字形变换
mihoyo题库的题目,竟然不需要会员就可写,记录一下,暂时没写。
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:
示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
- 1 <= s.length <= 1000
- s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
- 1 <= numRows <= 1000
思路
思路是每层的字符间距是有规律的,可按照题目模拟,但需要找出遍历的规律。