• 关于复杂数据的处理


    剑指 Offer 67. 把字符串转换成整数

    • 首先我们要除去两端的空格
    • 关于第一个的字符我们有四种可能 1 + 2 - 3 数字 4其他字符 
    • 我们的数据可能超过了int的范围的处理
    1. class Solution {
    2. public int strToInt(String str) {
    3. str=str.trim();
    4. char arr[]=str.toCharArray();
    5. int len=str.length();
    6. if(len<=0) return 0;
    7. boolean flag= arr[0]=='-'? true:false;//坑1
    8. long ans=0;//坑2
    9. for(int i= arr[0]=='-'||arr[0]=='+'? 1:0;i
    10. if(!Character.isDigit(arr[i])){
    11. break;
    12. }
    13. if(flag){
    14. ans=ans*10-(arr[i]-'0');
    15. }else{
    16. ans=ans*10+(arr[i]-'0');
    17. }
    18. if (ans > Integer.MAX_VALUE) return Integer.MAX_VALUE;
    19. if (ans < Integer.MIN_VALUE) return Integer.MIN_VALUE; //坑3
    20. }
    21. return (int) ans;
    22. }
    23. }

    剑指 Offer 20. 表示数值的字符串

     

     

    1. class Solution {
    2. public boolean isNumber(String s) {
    3. if(s==null||s.length()==0) return false;
    4. s=s.trim();
    5. boolean numFlag=false;
    6. boolean dotFalg=false;
    7. boolean eFlag=false;
    8. for(int i=0;i
    9. if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
    10. numFlag=true;
    11. }else if(s.charAt(i)=='.'&&!dotFalg&&!eFlag){
    12. dotFalg=true;
    13. //出现了.,前面没出现e,且没有出现过.
    14. }else if((s.charAt(i)=='e'||s.charAt(i)=='E')&&!eFlag&&numFlag){
    15. //出现了e,我们要判定前面没有出现过e,并且出现了数字
    16. eFlag=true;
    17. numFlag=false;//为了避免123e这种请求,出现e之后标志为false
    18. }else if((s.charAt(i)=='+'||s.charAt(i) == '-')&&
    19. (i==0||s.charAt(i-1)=='e'||s.charAt(i - 1) == 'E')){
    20. }else{
    21. return false;
    22. }
    23. }
    24. return numFlag;
    25. }
    26. }
    • 首先不管哪种情况都必须要有数字,没有数字肯定不对,其次对于存在 e 的情况,接收到 e 时已经判断前面有数字了,并将 numFlag 重置,意味着当接收到 e 后,如果后面没有数字(没有将 numFlag 重新标记为真),那么也是不对的。

    剑指 Offer 44. 数字序列中某一位的数字

     

    1. /* 数字范围 数量 位数 占多少位
    2. 1-9 9 1 9
    3. 10-99 90 2 180
    4. 100-999 900 3 2700
    5. 1000-9999 9000 4 36000 ...

    比如4399为例子

    • 先不去考虑0这个数
    • 首先我们知道一个几位数占多少位是由数量*位数 4399>9,所以不是一位数的范围
    • 4399>180+9 所以也不是  二位数的范围
    • 4399>2700+180+9,所以也不是三位数的范围
    • 4399<36000+2700+180+9,所以可以确定是四位数
    • 在四位数中的哪个四位数呢,我们知道第一个四位数是1000,4399-2700-180-9=1510
    • 我们要确定是在那个数,我们知道距离四位数的第一个数字的距离是1510,一个四位数占四个数字,所以应该是(1510-1)/4=377,为什么减1,因为我们是没有考虑0的,所以应该减去
    • 然后得到n在1000+377=1377中的那个数字那个数字,1509%4=1,所以是3

     

    1. class Solution {
    2. public int findNthDigit(int n) {
    3. int dight=1;//用来记录n所在数字的位数
    4. long start=1;//数字范围开始的第一个数
    5. long count=9;//占了多少位
    6. while(n>count){
    7. n-=count;
    8. dight++;
    9. start*=10;
    10. count=dight*start*9;
    11. }
    12. long num=start+(n-1)/dight;
    13. return Long.toString(num).charAt((n-1)%dight)-'0';
    14. }
    15. }
  • 相关阅读:
    Java Stack 类
    【Go 基础篇】Windows 开发常用 Dos 命令
    docker启动链接sqlservr的镜像时报SSl错误
    75-Java的List系列集合、集合的并发修改异常问题
    L9ARM体系结构与接口技术--ARM指令集仿真环境搭建(day5)
    【Docker】命令使用大全
    在C#中进行单元测试
    SpringBoot--maven-wrapper(mvnw)--使用/详解
    Socket,Servlet,Tomcat
    常见的几种填充方式:ZeroPad2d/ReflectionPad2d...(Pytorch)
  • 原文地址:https://blog.csdn.net/qq_50985215/article/details/126842853