剑指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 <s.length(); i++) {
            if (s.charAt(i)==' '){
                sb.append("%20");
            }else {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }

解法二: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;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值