首页 > 其他分享 >双指针

双指针

时间:2023-09-26 17:55:52浏览次数:31  
标签:数字串 charAt int res substring && 指针

双指针

OD281 在字符串中找出连续最长的数字串(含“+-”号)

请在一个字符串中找出连续最长的数字串,并返回这个数字串。
如果存在长度相同的连续数字串,返回最后一个。
如果没有符合条件的字符串,返回空字符串””。
注意:
数字串可以由数字”0-9″、小数点”.”、正负号”±”组成,长度包括组成数字串的所有符号。
“.”、“±”仅能出现一次,”.”的两边必须是数字,”±”仅能出现在开头且其后必须要有数字。
长度不定,可能含有空格。

思路:当前值如果是 + 或者 - 的话,就意味着是一个新的开始
如果因为 . 超过 1 个的话,跳过第一个 .

import java.util.Scanner;
import java.util.*;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        int len = Integer.MIN_VALUE;
        int count2 = 0;  //  记录:. 个数
        int[] res = new int[2];

        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int l = 0;
        int r = 0;
        for (int i = 0; i < s.length(); i++) {
            r++;
            char c = s.charAt(i);
            if (!Character.isDigit(c) && c != '+' && c != '-' && c != '.'){
                l = r;
                count2 = 0;
            }

            if (c == '+' || c == '-' || c == '.'){
                if (c == '+' || c =='-'){   //  只能位于开头【新的开端】
                    l = i;
                    count2 = 0;
                }
                if (c == '.'){
                    if (!(i - 1 >= 0 && i + 1 < s.length() && Character.isDigit(s.charAt(i - 1)) && Character.isDigit(s.charAt(i + 1)))){
                        l = r;  //  无效的 .
                    }else {
                        count2++;  //  有效的 .
                    }
                }
            }

            if (count2 > 1){
                while (l < r){
                    char temp = s.charAt(l);
                    if (temp == '.'){
                        l++;
                        count2 -= 1;    //  跳过一个 . 
                        break;
                    }
                    l++;
                }
            }
            if (r - l >= len){
                len = r - l;
                if (len == 1){
                    char c1 = s.substring(l, r).charAt(0);
                    if (Character.isDigit(c1)){  //  有效数字
                        res[0] = l;
                        res[1] = r;
                    }
                }else {
                    res[0] = l;
                    res[1] = r;
                }
            }
        }
        String substring = s.substring(res[0], res[1]);
        if (substring.length() == 1 && !Character.isDigit(substring.charAt(0))){  //  特殊情况,只剩一个 +-.
            System.out.println("");
            return;
        }
        System.out.println(substring);    //  substring 不包含末尾!!!
    }
}

标签:数字串,charAt,int,res,substring,&&,指针
From: https://www.cnblogs.com/aclq/p/17730833.html

相关文章

  • C语言双指针法解决-有序数组的平方
     力扣(LeetCode)官网-全球极客挚爱的技术成长平台/***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intcmp(constvoid*a,constvoid*b){return(*(int*)a)-(*(int*)b);}int*sortedSquares(int*nums,intnumsSize,......
  • C语言双指针法
    167.两数之和II-输入有序数组-力扣(LeetCode) /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/int*twoSum(int*numbers,intnumbersSize,inttarget,int*returnSize){//双指针法intleft=0;intright=nu......
  • C++虚函数剖析-从二级指针角度
    tags:C++categories:C++写在前面一直说C++的多态,其实底层原理是虚函数支持,那么虚函数的底层原理呢,之前一直停留在表面,直到后来看了很多书籍/视频/博客文章,才有了一点深刻的理解,下面来具体看看如何通过C指针进行虚函数的调用,相当于对C指针的一个复习,同时也......
  • 使用Optional优雅避免空指针异常
    本文已收录至GitHub,推荐阅读......
  • 力扣16.最接近的三数之和(双指针)
    给你一个长度为 n 的整数数组 nums 和一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。 示例1:输入:nums=[-1,2,1,-4],target=1输出:2解释:与target最接近的和是2(-1+2+......
  • 初阶指针详解
    (目录)1.内存和地址内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的所以为了有效的使用内存,就把内存划分成一个个小块,这每一个小块被称为内存单元,每个内存单元的大小是1个字节为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该......
  • 基础双指针算法:单队列、双队列
    1、单队列输入一串字符串,字符串有多个由单个逗号隔开的单词,任务是需要把单词间隔开,每个单词换行输出。输入样例abcdefghi输出样例abcdefghi#include<iostream>usingnamespacestd;constintN=1010;intmain(){charstr[N];#definegets(str)gets_s(str......
  • 访问空指针出panic
    panic信息:<4>[1670581299]15:Failedonwritei2cdev=23(I2CDEV_RFSW0)<4>[1670581299]15:txretryfailed<4>[1670581299]15:Failedonwritei2cdev=23(I2CDEV_RFSW0)<1>[1670595592]4:CPU4Unabletohandlekernelpagingrequestatvir......
  • 1787_函数指针的使用
    全部学习汇总:GitHub-GreyZhang/c_basic:littlebitsofc.前阵子似乎写了不少错代码,因为对函数指针的理解还不够。今天晚上似乎总算是梳理出了一点眉目,在先前自己写过的代码工程中做一下测试。先前实现过一个归并排序算法,算法函数的一个传入参数是指向一个比较功能函数的指针。......
  • int (*s[10]) (int);含义,函数指针。
    问题int(*s[10])(int);含义是什么?答案是一个包含10个函数指针的数组的声明。示例一般情况看到的函数指针如下:intfun1(int);//这是一个函数声明int(*pf)(int);//声明了一个函数指针pf=fun1;//将函数的地址赋值给pf。这里的函数指针仅有一个pf,而问题中是用数组存放函......