2.替换空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public String replaceSpace(StringBuffer str) {
return str.toString().replace(" ","%20");
}
public String replaceSpace(StringBuffer str) {
StringBuilder sb = new StringBuilder();
for(int i=0; i <str.length(); i++){
char c = str.charAt(i);
if(c == ' '){
sb.append("%20");
}else{
sb.append(c);
}
}
return sb.toString();
}
34.在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
public int FirstNotRepeatingChar(String str) {
if(str == null || str.length() ==0) return -1;
int [] ch = new int[128];
for(int i = 0; i< str.length();i++){
ch[str.charAt(i)-'0'] +=1;
}
for(int j = 0; j< str.length();j++){
if(ch[str.charAt(j)- '0'] == 1){
return j;
}
}
return -1;
}
43.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”
public String LeftRotateString(String str,int n) {
StringBuilder sb = new StringBuilder();
if(str == null || str.length() == 0) return sb.toString();
for(int i=n; i < str.length();i++){
sb.append(str.charAt(i));
}
for(int j=0; j<n;j++){
sb.append(str.charAt(j));
}
return sb.toString();
}
44.翻转单词顺序列
输入
“nowcoder. a am I”
返回值
“I am a nowcoder.”
public String ReverseSentence(String str) {
if(str.trim().equals("") ) return str;
String[] a = str.split(" ");
StringBuffer sb = new StringBuffer();
if(str == null || str.length() ==0) return sb.toString();
for(int i = a.length;i>0;i--){
sb.append(a[i-1]);
if(i>1){
sb.append(" ");
}
}
return sb.toString();
}
45.“红心A,黑桃3,小王,大王,方片5”,不是顺子,大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4), 现在,要求你使用这幅牌模拟上面的过程, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
输入
[0,3,2,6,4]
返回值
true
public boolean isContinuous(int [] numbers) {
if(numbers.length<=0) return false;
Arrays.sort(numbers);
int numzero=0;
int num = 0;
for(int i =0;i<numbers.length;i++){
if(numbers[i] == 0){
numzero++;
}
}
int small = numzero;
int big = numzero+1;
while(big < numbers.length){
if(numbers[small] == numbers[big]) return false;
num +=numbers[big++] - numbers[small++]-1;
}
if(numzero >= num) return true;
return false;
}
49.将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
输入一个字符串,包括数字字母符号,可以为空
返回值描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1
输入:"+2147483647"
返回值:2147483647
示例2
输入:“1a33”
返回值:0
public int StrToInt(String str) {
if(str == null || str.length()<=0) return 0;
StringBuffer sb = new StringBuffer();
for(int i=0; i< str.length();i++){
if(str.charAt(i)-'0'>9) return 0;
if(str.charAt(i)-'0'>= 0 && str.charAt(i)-'0'<= 9){
sb.append(str.charAt(i)-'0');
}
return sb.toint();
}
return 0;
}
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
pow() 方法可返回 x 的 y 次幂的值。
public int StrToInt(String str) {
if(str == null || str.length()<=0) return 0;
str = str.replace("+","");
boolean flag = false;
if(str.indexOf("-")==0){
str = str.replace("-","");
flag = true;
}
byte[] s = str.getBytes();
int num = 0;
for(int i = s.length-1 ;i>=0;i--){
if(s[i]-'0'>=0 && s[i]-'0'<= 9){
num += (s[i] -'0')*Math.pow(10,s.length -1-i);
}else{
return 0;
}
}
return flag? 0-num: num;
}
52.请实现一个函数用来匹配包括’.’,“aa"的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"aba"均不匹配
示例1
输入:“aaa”,"aa”
返回值:true
public boolean match(char[] str, char[] pattern)
{
if(str == null && pattern == null) return true;
if(str == null&& pattern != null ||str != null && pattern == null) return false;
return matchcore(str,0,pattern,0);
}
public boolean matchcore(char[] str, int i,char [] pattern,int j){
if(i == str.length && j == pattern.length) return true;
if(i< str.length && j == pattern.length) return false;
if(j+1<pattern.length && pattern[j+1] == '*'){
if(i < str.length && (str[i]== pattern[j] || pattern[j] == '.')){
return matchcore(str,i+1,pattern,j) || matchcore(str,i,pattern,j+2) || matchcore(str,i+1,pattern,j+2);
}else{
return matchcore(str,i,pattern,j+2);
}
}else {
if(i < str.length && (str[i] == pattern[j] || pattern[j] == '.')){
return matchcore(str,i+1,pattern,j+1);
}
return false;
}
}
59.请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
示例1
输入:“123.45e+6”
返回值:true
输入
“1.2.3”
返回值:false
String.valueOf(char[] data) : 将 char 数组 data 转换成字符串
indexOf(“string”,0)这个方法有两个参数,分别是要检索的字符串以及将从指定的位置开始检索。
注意:1、如果要检索的字符串值没有出现,则该方法返回 -1。
2、indexOf() 方法对大小写敏感!
public boolean isNumeric(char[] str) {
String s = String.valueOf(str);
if(str.length <= 0 || str == null) return false;
for(int i = 0; i< str.length;i++){
char c = s.charAt(i);
if(!((c >= '0' && c <= '9' ) || c =='e' || c =='E' || c == '+' || c == '-' || c == '.')){
return false;
}
}
if(s.charAt(str.length-1) == 'e' ||s.charAt(str.length-1) == 'E' || s.charAt(str.length-1) == '+' ||s.charAt(str.length-1) == '-'){
return false;
}
if(s.indexOf('.') != s.lastIndexOf('.')) return false;
for(int i=1; i <str.length ;i++){
char c = s.charAt(i);
if(c == '+' || c == '-'){
if(!(s.charAt(i-1) == 'e' ||s.charAt(i-1) == 'E') || !(s.charAt(i-1) >= '0' && s.charAt(i+1) <= '9' )){
return false;
}
}
}
e的后面不能有数字12E+4.3
for(int i=1;i < str.length; i++){
char c = s.charAt(i);
if(c == 'e' || c == 'E'){
if(s.charAt(i+1) == '+'|| s.charAt(i+1) == '-'){
if(s.indexOf('.',i+2) != -1) return false;
}
}
}
return true;
54.请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
返回值描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
StringBuffer sb = new StringBuffer();
public void Insert(char ch)
{
sb.append(ch);
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce(){
char [] array = sb.toString().toCharArray();
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
int count;
for(int i=0 ; i < array.length;i++){
if(map.containsKey(array[i])){
count = map.get(array[i]);
map.put(array[i],count++);
}else{
map.put(array[i],count);
}
}
for(int i=0; i < array.length;i++){
if(map.get(array[i]) ==1){
return array[i];
}
}
return '#';
}