• 反转问题(字符串和链表)


    最近刷代码随想录的双指针法时,遇到了不少的反转问题。

    1、Leetcode 151 反转字符串中的单词(较难的字符串反转问题)

    代码随想录说,如果直接使用split函数就变成了一道水题...

    但我感觉输入的格式问题也是比较棘手的,我的思路是先找到字符串中第一个不为' '的字符,得到它的索引值,然后遍历到索引为s.length()-2的字符,遍历的字符如果不为' '或者为' '但是下一个字符不为' ',则append到新的StringBuilder中,最后把索引为s.length()-1的字符append到新的StringBuilder,因为索引为s.length()-1的字符的下一个字符会超出索引范围,所以需要单独处理,但是因为只有一个空格,不论最后一个字符是不是空格,split都可以成功的分割(总共的第一步是先去除多余的空格,有点类似移除元素的操作)

    然后再使用倒序,即可获得一个新的StringBuilde,通过toString可以转化成目标字符串。

    注意事项:

    1、StringBuilder的toString()用法需要加括号

    2、StringBuilder的append()用法可以是字符串也可以是字符(String没有append用法,只能拼接)

    3、String的split()用法生成的是String[]类型(StringBuilder没有split用法)

    1. class Solution {
    2. public String reverseWords(String s) {
    3. StringBuilder temp = new StringBuilder();
    4. StringBuilder result = new StringBuilder();
    5. int n = s.length();
    6. int index = 0;
    7. for(int i=0;i
    8. if(s.charAt(i) != ' ') {
    9. index = i;
    10. break;
    11. }
    12. }
    13. for(int i = index; i < n-1; i++) {
    14. if( s.charAt(i) != ' ' || (s.charAt(i) == ' ' && s.charAt(i+1) != ' ')) {
    15. temp.append(s.charAt(i));
    16. }
    17. }
    18. temp.append(s.charAt(n-1));
    19. String[] sub = temp.toString().split(" ");
    20. for(int i=sub.length-1;i>0;i--) {
    21. result.append(sub[i]);
    22. result.append(" ");
    23. }
    24. result.append(sub[0]);
    25. return result.toString();
    26. }
    27. }

    下次使用代码思想录的双指针用法时,再添加上。

    2、Leetcode 206 反转链表

    该问题比较简单,之前也刷过该题目

    但是长期不做链表的题目就容易疏忽一些注意事项

    1、链表的head指针不能随便更改

    2、在链表的尾部指向的是null

    3、初始化用low指针指向null,fast指向head(因为反转必须有左右两个对象),第一次反转时,fast的左对象为null,右对象为原本的下一个节点,从指向右对象,变成了指向左对象,然后通过temp暂存fast原本的下一个节点的位置。(用fast和low命名是为了明确该方法用的也是双指针法,用cur和pre也是可以的)

    1. class Solution {
    2. public ListNode reverseList(ListNode head) {
    3. ListNode low = null;
    4. ListNode fast = head;
    5. ListNode temp = null;
    6. while(fast != null) {
    7. temp = fast.next;
    8. fast.next = low;
    9. low = fast;
    10. fast = temp;
    11. }
    12. return low;
    13. }
    14. }

  • 相关阅读:
    springboot引入redisson分布式锁及原理
    Jenkins Pipeline 方法(函数)定义及调用
    PDF怎么转换成Word文档呢?不妨试试这两种方法!
    【ARM CoreLink 系列 6 -- DMC-400控制器简介】
    解析 Python requests 库 POST 请求中的参数顺序问题
    LDAP——实现用户统一登录管理
    学习阶段单片机买esp32还是stm32?
    Python数据可视化-----生成数据二
    北斗智能终端:助力森林保护的新利器
    Spring Security6 用户身份认证
  • 原文地址:https://blog.csdn.net/weixin_43582743/article/details/133207416