算法与数据结构 - String
2016-06-22 15:03
501 查看
将一个字符串中的空格替换成 "%20" 。
自定义一个正则表达式匹配类,用来匹配包括'.'和'*'的正则表达式。模式中的字符 ' . ' 表示任意一个字符,
而 ' * '表示它前面的字符可以出现任意次(包含0次),而且这里的匹配是指字符串的所有字符匹配整个模式。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
判断一个字符串是否为一个数值。
例如,"+100","5e2","-123","3.1416"和"-1E-16"都表示数值,但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"
都不是数值。
正则表达式规则
\\+- +-的转义表达
[\\+-] +-集合,即出现+或出现-
? 出现0次或1次
[\\+-]? 出现+,或出现-,或什么都不出现
* 出现任意次
[0-9]* 出现0-9中的任意一个数字任意次
\\. .的转移表达
(\\.[0-9]*)? 出现小数部分0次或1次
+ 出现1次以上
[eE][\\+-]?[0-9]+ 出现指数时的情况
统计字符流中第一个不重复的字符,如果当前字符流没有存在出现一次的字符,返回#字符。
测试用例:"google"
对应输出:"ggg#ll"
<span style="font-size:18px;">public class Solution { public String replaceSpace(StringBuffer str) { return str.toString().replaceAll(" ", "%20"); } }</span>
自定义一个正则表达式匹配类,用来匹配包括'.'和'*'的正则表达式。模式中的字符 ' . ' 表示任意一个字符,
而 ' * '表示它前面的字符可以出现任意次(包含0次),而且这里的匹配是指字符串的所有字符匹配整个模式。
例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。
<span style="font-size:18px;">public class Solution { public boolean match(char[] str, char[] pattern) { if (str == null || pattern == null) { return false; } int strIndex = 0; int patternIndex = 0; return isMatch(str, strIndex, pattern, patternIndex); } /** 递归判断 **/ public boolean isMatch(char[] str, int strIndex, char[] pattern, int patternIndex) { // str到尾,pattern到尾,匹配成功。 if (strIndex == str.length && patternIndex == pattern.length) { return true; } // str未到尾,pattern到尾,匹配失败。 if (strIndex != str.length && patternIndex == pattern.length) { return false; } // str到尾,pattern未到尾,(不一定匹配失败,因为a*可以匹配0个字符) if (strIndex == str.length && patternIndex != pattern.length) { //只有pattern剩下的部分类似a*b*c*的形式,才匹配成功 if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') { return isMatch(str, strIndex, pattern, patternIndex + 2); } return false; } //str未到尾,pattern未到尾 if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') { if (pattern[patternIndex] == str[strIndex] || (pattern[patternIndex] == '.' && strIndex != str.length)) { return isMatch(str, strIndex, pattern, patternIndex + 2)//*匹配0个,跳过 || isMatch(str, strIndex + 1, pattern, patternIndex + 2)//*匹配1个,跳过 || isMatch(str, strIndex + 1, pattern, patternIndex);//*匹配1个,再匹配str中的下一个 } else { //直接跳过*(*匹配到0个) return isMatch(str, strIndex, 4000 pattern, patternIndex + 2); } } if (pattern[patternIndex] == str[strIndex] || (pattern[patternIndex] == '.' && strIndex != str.length)) { return isMatch(str, strIndex + 1, pattern, patternIndex + 1); } return false; } }</span>
判断一个字符串是否为一个数值。
例如,"+100","5e2","-123","3.1416"和"-1E-16"都表示数值,但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"
都不是数值。
<span style="font-size:18px;">public class Solution { public boolean isNumeric(char[] str) { String string = String.valueOf(str); return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?"); } }</span>
正则表达式规则
\\+- +-的转义表达
[\\+-] +-集合,即出现+或出现-
? 出现0次或1次
[\\+-]? 出现+,或出现-,或什么都不出现
* 出现任意次
[0-9]* 出现0-9中的任意一个数字任意次
\\. .的转移表达
(\\.[0-9]*)? 出现小数部分0次或1次
+ 出现1次以上
[eE][\\+-]?[0-9]+ 出现指数时的情况
统计字符流中第一个不重复的字符,如果当前字符流没有存在出现一次的字符,返回#字符。
测试用例:"google"
对应输出:"ggg#ll"
<span style="font-size:18px;">import java.util.*; public class Solution { HashMap<Character, Integer> map = new HashMap<Character, Integer>(); ArrayList<Character> list = new ArrayList<Character>(); //Insert one char from stringstream public void Insert(char ch) { if (map.containsKey(ch)) { map.put(ch, map.get(ch)+1); } else { map.put(ch, 1); } list.add(ch); } //return the first appearence once char in current stringstream public char FirstAppearingOnce() { char c = '#'; for (char ch : list) { if (map.get(ch) == 1) { c = ch; break; } } return c; } }</span>
相关文章推荐
- 数据结构之【队列】--复习
- 查找-第9章-《数据结构题集》习题解析-严蔚敏吴伟民版
- 《Java数据结构与算法》笔记-CH4-6优先级队列
- 欢迎使用CSDN-markdown编辑器
- 数据结构 -- 简单体会
- HDU5320 Fan Li
- 《Java数据结构与算法》笔记-CH4-5不带计数字段的循环队列
- 数据结构 : Hash Table
- halcon学习笔记——(10)从数字图像基础到halcon数据结构概述
- 《Java数据结构与算法》笔记-CH4-4循环队列
- 数据结构知识点归纳
- 一步一步写平衡二叉树(AVL树)
- 9-12-哈希查找表/散列表-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
- MySQL索引背后的数据结构及算法原理
- 《数据结构》创建二叉树
- 汇编实现排序——简单选择排序
- 数据结构 - 树和二叉树的基本运算实现
- Redis 数据结构
- Java数据结构和算法——数组、单向链表、双向链表
- 【数据结构与算法】十六 二叉树遍历 Breadth-First-Search 广度优先