表示数值的字符串&&字符流中第一个不重复的字符
程序员文章站
2022-05-12 22:23:08
...
表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题思路
- 一一判断条件是否符合
- 用正则表达式来表示,很方便
代码
/**
* 剑指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"。
输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。
解题思路
- 第一种方法来记字符的次数
- 第二种是用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());
}
}
}
下一篇: 整数反转