剑指offer字符串专题(java)

19 篇文章 0 订阅

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”,"a
a”
返回值: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。
   2indexOf() 方法对大小写敏感!
   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 '#';
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值