lc字符串(反转|替换)

344.反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解题思路:使用双指针进行遍历交换

class Solution {
    public void reverseString(char[] s) {
     int right=s.length-1;//right>s.length/2
     for(int left=0;left<s.length/2;left++){
         char temp=s[left];
         s[left]=s[right];
         s[right]=temp;
         right--;
     }
    }
}

541.反转字符串

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

class Solution {
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int len = chars.length;
        int start = 0;
        while (len > 0) {
            if (len < k) {
                reversePartStr(chars, start, chars.length - 1);
                break;
            } else if ((len >= k) && (len < 2 * k)) {
                reversePartStr(chars, start, start + k - 1);
                break;
            } else {
                reversePartStr(chars, start, start + k - 1);
                len -= 2 * k;
                start += 2 * k;
            }
        }
        return String.valueOf(chars);
    }
 
    public void reversePartStr(char[] chars, int start, int end) {
        if (start > end) {
            return;
        }
        int temp = (end - start + 1) / 2;
        for (int i = start; i < start + temp; i++) {
            char mob = chars[i];
            chars[i] = chars[end];
            chars[end] = mob;
            end--;
        }
    }
}

剑指offer 05.替换空格

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

class Solution {
        public String replaceSpace(String s) {
       StringBuffer buffer=new StringBuffer(s);
       for(int i=0;i<buffer.length();i++){
           if(' '== buffer.charAt(i)){
               buffer.replace(i,i+1,"%20");
           }
       }
       return buffer.toString();
    }
}

151.反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

解题思路:
1、移除多余空格
2、将整个字符串反转
3、 将每个单词反转

class Solution {
        public String reverseWords(String s) {
        StringBuilder builder=deleteSpce(deleteSAndE(s));//移除多余空格
        builder.reverse();// 反转整个StringBuilder
        // 对整个反转的StringBuilder继续处理
        // 再将每个单词反转回来
        int i=0;
        while (i<builder.length()){
            int j=i;
            while (j<builder.length() && builder.charAt(j)!= ' '){//到第一个单词最末尾,也就是空格时停下,存储这个单词
                j++;
            }
            char[] chars=builder.substring(i,j).toCharArray();// 存储每个单词
            reverseChars(chars);//反转单词
            builder.replace(i,j,String.valueOf(chars));
            i=j+1;
        }
        return builder.toString();

    }
    private void reverseChars(char[] chars){
        for(int i=0;i<chars.length/2;i++){
            char temp=chars[i];
            chars[i]=chars[chars.length-1-i];
            chars[chars.length-1-i]=temp;

        }
    }
    private StringBuilder deleteSpce(String s){    // 去除中间多余的空格
     StringBuilder sb=new StringBuilder();
     for(int i=0;i<s.length();i++){
         if(s.charAt(i)!=' '){
             sb.append(s.charAt(i));
         }else{
             if(s.charAt(i+1)!= ' '){
                 sb.append(' ');//如果空格只有一个,就添加这个空格
             }
         }
         }
         return sb;
     }

    private String deleteSAndE(String s){//去除左边及右边空格
        int left=0;
        int right=s.length()-1;
        while (s.charAt(left)==' '){
            left++;
        }
        while (s.charAt(right)==' '){
            right--;
        }
        return s.substring(left,right+1);
    }
}

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

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
解题思路:
1、翻转前n个字符串 ab->ba
2、翻转剩下的字符串 cdefg->gfedc
3、翻转整个字符串 bagfedc->cdrfgab

class Solution {
       public String reverseLeftWords(String s, int n) {
      char[] chars=s.toCharArray();
      reverceChar(chars,0,n-1);
      reverceChar(chars,n,s.length()-1);
      reverceChar(chars,0,s.length()-1);
      return new String(chars);
    }
    public static void reverceChar(char[] chars,int start,int end){
        if(start>=end){
            return;
        }
        int mid=(start+end+1)/2;
        while (start<mid){
            char temp=chars[start];
            chars[start]=chars[end];
            chars[end]=temp;
            start++;
            end--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值