双指针
双指针
OD281 在字符串中找出连续最长的数字串(含“+-”号)
请在一个字符串中找出连续最长的数字串,并返回这个数字串。
如果存在长度相同的连续数字串,返回最后一个。
如果没有符合条件的字符串,返回空字符串””。
注意:
数字串可以由数字”0-9″、小数点”.”、正负号”±”组成,长度包括组成数字串的所有符号。
“.”、“±”仅能出现一次,”.”的两边必须是数字,”±”仅能出现在开头且其后必须要有数字。
长度不定,可能含有空格。
# 用例
0.0.0.0.0.1 # 0.1
5+. # 5
1234567890abcd9.9+12345.678.9ed # +12345.678
0.0-1.1 # -1.1
思路:
- 有2次reset机会,每次都要清空 . 的个数,并让 l = r,一切都重新开始
- 当前是 + 或者 -
- 无效的 .
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] ans = new int[2];
int pointCount = 0;
String s = in.nextLine();
int l = 0;
int r = 0;
int res = Integer.MIN_VALUE;
for (int i = 0; i < s.length(); i++) {
r++;
char c = s.charAt(i);
if (!Character.isDigit(c) && c != '.' && c != '+' && c != '-'){
l = r;
pointCount = 0; // reset
continue;
}
if (c == '+' || c == '-'){
l = i; // 新的开始
pointCount = 0; // reset
}
if (c == '.'){
if (i - 1 >= 0 && Character.isDigit(s.charAt(i - 1)) && i + 1 < s.length() && Character.isDigit(s.charAt(i + 1))){
pointCount++;
}else { // 无效的
l = r;
pointCount = 0; // reset
}
}
if (pointCount > 1){
while (l < s.length()){
if (s.charAt(l) == '.'){ // 移动到第一个. 的后一个位置
l++;
pointCount -= 1;
break;
}
l++;
}
}
if (r - l >= res){
res = r - l;
if (r - l == 1){
String substring = s.substring(l, r);
char temp = substring.charAt(0);
if (Character.isDigit(temp)){
ans[0] = l;
ans[1] = r;
}
}else {
ans[0] = l;
ans[1] = r;
}
}
}
System.out.println(s.substring(ans[0], ans[1]));
}
}
OD208. 事件推送
二分查找
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] split = in.nextLine().split(" ");
int m = Integer.parseInt(split[0]);
int n = Integer.parseInt(split[1]);
int R = Integer.parseInt(split[2]);
int[] A = new int[m];
int[] B = new int[n];
String[] split1 = in.nextLine().split(" ");
for (int i = 0; i < m; i++) {
A[i] = Integer.parseInt(split1[i]);
}
String[] split2 = in.nextLine().split(" ");
for (int i = 0; i < n; i++) {
B[i] = Integer.parseInt(split2[i]);
}
for (int i : A) {
int index = Arrays.binarySearch(B, i);
if (index < 0){
index = -index - 1;
if (index == n){
continue;
}
if (B[index] - i <= R){
System.out.println(i + " " + B[index]);
}
}else {
System.out.println(i + " " + B[index]);
}
}
}
}
双指针
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] split = in.nextLine().split(" ");
int m = Integer.parseInt(split[0]);
int n = Integer.parseInt(split[1]);
int R = Integer.parseInt(split[2]);
int[] A = new int[m];
int[] B = new int[n];
String[] split1 = in.nextLine().split(" ");
for (int i = 0; i < m; i++) {
A[i] = Integer.parseInt(split1[i]);
}
String[] split2 = in.nextLine().split(" ");
for (int i = 0; i < n; i++) {
B[i] = Integer.parseInt(split2[i]);
}
int i = 0;
int j = 0;
while (i < A.length && j < B.length){
int a = A[i];
int b = B[j];
if (a <= b){
if (b - a <= R){
System.out.println(a + " " + b);
i++;
}else {
i++;
}
}else {
j++;
}
}
}
}
324. 判断字符串子序列
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String target = in.nextLine();
String s = in.nextLine();
if (target.length() == 1){
System.out.println(s.lastIndexOf(target));
return;
}
int cursor = target.length() - 1;
int res = -1;
for (int i = s.length() - 1; i >= 0; i--) {
if (target.charAt(cursor) == s.charAt(i)){
cursor--;
}
if (cursor == -1){
res = i;
break;
}
}
System.out.println(res);
}
}