双指针

双指针

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

思路:

  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);
    }
}
posted @ 2023-09-26 17:49  爱新觉罗LQ  阅读(10)  评论(0编辑  收藏  举报