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

表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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());
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41676282/article/details/90943786