剑指Offer-学习计划(一)字符串篇

剑指 Offer 05. 替换空格

剑指 Offer 58 - II. 左旋转字符串

剑指 Offer 20. 表示数值的字符串 

剑指 Offer 67. 把字符串转换成整数 

字符串考点:

  • StringBuilder&StringBuffer 及其所属API
  • 各种字符串本身Api:subString、split、parse、charAt、contains、replaceAll
  • 对于数组链表等结构的应用、双指针等

题目一:替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

解法一:使用StringBuffer、循环遍历替换即可

public String replaceSpace(String s) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i 

解法二:replaceAll简单粗暴替换

 public String replaceSpace2(String s) {
        return s.replaceAll(" ","%20");
    }

题目二:左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1: 输入: s = "abcdefg", k = 2 输出: "cdefgab"

示例 2: 输入: s = "lrloseumgh", k = 6 输出: "umghlrlose" 

解法一:直接两个subString拼装返回即可,效率实在一般

public String reverseLeftWords(String s, int n) {
        String s1 = s.substring(0,n);
        String s2 = s.substring(n);
        return s2+s1;
    }

解法二:使用整体反转+局部反转实现反转单词顺序,不用额外空间

public String reverseLeftWords(String s, int n) {
        int len=s.length();
        StringBuilder sb=new StringBuilder(s);
        reverseString(sb,0,n-1);
        reverseString(sb,n,len-1);
        return sb.reverse().toString();
    }
public void reverseString(StringBuilder sb, int start, int end) {
            while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
            }
        }

题目三: 表示数值的字符串

解法一:去除字符串隐患,之后转换Float,因为可能包含浮点数

    public boolean isNumber(String s) {
        if (s.contains("f"))return false;
        if (s.contains("F"))return false;
        if (s.contains("d"))return false;
        if (s.contains("D"))return false;
        try{
            Float.parseFloat(s);
            return true;
        }catch (NumberFormatException e){
            return false;
        }
    }

解法二:去掉首位空格后对字符串判断合法性,去伪存真

 public boolean isNumber(String s) {
        if (s == null || s.length() == 0) return false;
        //去掉首位空格
        s = s.trim();
        boolean numFlag = false;
        boolean dotFlag = false;
        boolean eFlag = false;
        for (int i = 0; i < s.length(); i++) {
            //判定为数字,则标记numFlag
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                numFlag = true;
                //判定为.  需要没出现过.并且没出现过e
            } else if (s.charAt(i) == '.' && !dotFlag && !eFlag) {
                dotFlag = true;
                //判定为e,需要没出现过e,并且出过数字了
            } else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {
                eFlag = true;
                numFlag = false;//为了避免123e这种请求,出现e之后就标志为false
                //判定为+-符号,只能出现在第一位或者紧接e后面
            } else if ((s.charAt(i) == '+' || s.charAt(i) == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {

                //其他情况,都是非法的
            } else {
                return false;
            }
        }
        return numFlag;
    }

题目四:把字符串转换成整数

解法一:手搓数据校验,不推荐尝试

    public int strToInt(String str) {
        int res = 0, bndry = Integer.MAX_VALUE / 10;
        int i = 0, sign = 1, length = str.length();
        if (length == 0) return 0;
        while (str.charAt(i) == ' ')
            if (++i == length) return 0;
        if (str.charAt(i) == '-') sign = -1;
        if (str.charAt(i) == '-' || str.charAt(i) == '+') i++;
        for (int j = i; j < length; j++) {
            if (str.charAt(j) < '0' || str.charAt(j) > '9') break;
            if (res > bndry || res == bndry && str.charAt(j) > '7')
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            res = res * 10 + (str.charAt(j) - '0');
        }
        return sign * res;
    }

你可能感兴趣的:(数据结构与算法学习,学习,java)