欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

表示数值的字符串&&字符流中第一个不重复的字符

程序员文章站 2022-05-12 22:23:08
...

表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

解题思路

  1. 一一判断条件是否符合
  2. 用正则表达式来表示,很方便

代码

/**
 * 剑指offer一刷:表示数值的字符串
 *
 * @author User
 * @create 2019-06-04-20:29
 */

public class jzo53 {
    public boolean isNumeric(char[] str) {
        if (str==null||str.length==0){
            return false;
        }
//        标记符号,小数点,e/E有没有出现
        boolean sign=false,decimal=false,hasE=false;
        for (int i=0;i<str.length;i++){
            if (str[i]=='e'||str[i]=='E'){
//                e/E后面一定接数字
                if (i==str.length-1){
                    return false;
                }
                if (hasE==true){
                    return false;
                }
                hasE=true;
            }else if (str[i]=='+'||str[i]=='-'){
//                第二次出现'+'、'-'是在e/E后面
                if (sign==true&&str[i-1]!='e'&&str[i-1]!='E'){
                    return false;
                }
//                第一次出现+-符号,且不是在字符串开头,则必须紧接在e/E之后
                if (!sign&&i>0&&str[i-1]!='e'&&str[i-1]!='E'){
                    return false;
                }
                sign=true;
            }else if (str[i]=='.'){
//                e后面不能接小数点,小数点不能出现两次
                if (hasE==true||decimal==true){
                    return false;
                }
                decimal=true;
            }else if (str[i]<'0'||str[i]>'9'){
                return false;
            }
        }
        return true;
    }
    public boolean isNumeric1(char[] str) {
        String newstr=String.valueOf(str);
        return newstr.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
    }
    public static void main(String[] args){
        String str="1.2.3";
        char[] ch=str.toCharArray();
        jzo53 so=new jzo53();
        System.out.println(so.isNumeric(ch));
        System.out.println(so.isNumeric1(ch));

    }
}

字符流中第一个不重复的字符

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。

解题思路

  1. 第一种方法来记字符的次数
  2. 第二种是用HashMap来存储字符的次数,HashMap更好一点,因为数组存要先分内存
    表示数值的字符串&&字符流中第一个不重复的字符

代码

import java.util.ArrayList;
import java.util.HashMap;

/**
 * 剑指offer一刷:字符流中第一个不重复的字符
 *
 * @author User
 * @create 2019-06-05-19:47
 */

public class jzo54 {
//    存放char出现的次数
    int[] countArr=new int[128];
    ArrayList<Character> charList=new ArrayList<>();

    //Insert one char from stringstream
    public void Insert(char ch)
    {
        countArr[ch]++;
        if (countArr[ch]==1){
            charList.add(ch);
        }else {
            charList.remove((Character) ch);
        }
    }
    //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        if (charList.size()==0){
            return '#';
        }else {
            return charList.get(0);
        }
    }
    HashMap<Character,Integer> map=new HashMap<>();
    ArrayList<Character> list=new ArrayList<>();
    public void Insert1(char ch){
        if (map.containsKey(ch)){
            map.put(ch,map.get(ch)+1);
        }else {
            map.put(ch,1);
        }

        list.add(ch);
    }
    public char FirstAppearingOnce1(){
        char c='#';
        for (char key:list) {
            if (map.get(key)==1){
                c=key;
                break;
            }
        }
        return c;
    }
    public static void main(String[] args){
        String str="google";
        char[] ch=str.toCharArray();
        jzo54 so=new jzo54();
        for (int i=0;i<ch.length;i++){
            so.Insert(ch[i]);
            System.out.println(so.FirstAppearingOnce());
        }
        System.out.println("\n");
        for (int i=0;i<ch.length;i++){
            so.Insert1(ch[i]);
            System.out.println(so.FirstAppearingOnce1());
        }
    }
}
相关标签: 字符串