Day55=====

银联-01.回文链表(重要!!!)

链表涉及到回文——如果解决思路方向是双指针,就一定是左右指针。用上左右指针,那么就要用数组或者list才获取链表每一个结点的值

删除链表的结点可以是任意位置的,只要有一种可能:删除一个结点恰好构成回文,那他就一定是回文链表

class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 }

class Solution {
    //本质还是判断是不是回文
    //删除链表的结点可以是任意位置的,只要有一种可能:删除一个结点恰好构成回文,那他就一定是回文链表
    //转化为:该链表是回文链表的话,那么删除的那一个结点在哪一个位置
    public boolean isPalindrome(ListNode head) {
        //因为链表的长度不固定,所以并不能使用数组存储结点的值
        List<Integer> list = new ArrayList<>();
        ListNode temp = head;
        while (temp != null) {
            list.add(temp.val);//获取每一个结点的值
            temp = temp.next;
        }
        //利用左右指针,来判断是否回文。
        int left = 0, right = list.size() - 1;

        //删除的结点在除了最左边和最右边的地方【中间部分】
        while (left < right) {
            //判断是否回文,如果不相等,就说明删除的结点就在附近
            if (list.get(left) != list.get(right)) {
                break;
            }
            left++;
            right--;
        }
        //该数如果本身就是回文,那么经历了while后退出循环,left与right重合,那么他一定是回文
        //如果该数本身是回文,那么删除某一个结点后,他一定还是回文[例:1221删除了2、121还是回文。]
        if (left == right) {
            return true;
        }

        //如果删除的结点是right位置的或者left位置的 能构成回文就返回true
        if (Palindrome(list, left, right - 1) || Palindrome(list, left + 1, right)) {
            return true;
        }
        return false;
    }

    //判断是否是回文
    public boolean Palindrome(List<Integer> list, int left, int right) {
        while (left < right) {
            if (list.get(left) != list.get(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

49、字母异位词分组

 判断字母异位词:法一、使用数组计数  法二、将字符串进行转成数组后排序
此题使用法二

由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

class Solution {
    //判断字母异位词:法一、使用数组计数  法二、将字符串进行转成数组后排序
    //此题使用法二
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for(String s:strs){
            char[] c=s.toCharArray();//将字符串转成数组后进行排序
            Arrays.sort(c);
            String ans=String.valueOf(c);//再转回去,变成字符串
            if(!map.containsKey(ans)){//不包含的话,创建一个list
                //相同异位词要放在同一个list里
                List<String>list=new ArrayList<>();
                map.put(ans,list);
            }
            //如果包含这个异位词,那么就找到异位词所在的value——即list,然后把排序前的单词加入到这个list里
            map.get(ans).add(s);//等于list.add(s) 将排序前的单词加到list里
        }
        return new ArrayList(map.values());//等同于 addAll ?
    }
}

1347、制造字母异位词的最小步骤数 

题目要求将t变成s的字母异位词:

思路:先将t的字母出现次数存入数组中,因为要让t变成s的字母异位词,所以看看t缺少s的哪些字母及次数,故用t减去s,s中次数大于0的,就是t所缺少的。

class Solution {
    public int minSteps(String s, String t) {
        //将t变成s的字母异位词
        //先将t的字母出现次数存入数组中,因为要让t变成s的字母异位词,所以看看t缺少s的哪些字母及次数
        //用t减去s,s中次数大于0的,就是t所缺少的
        int[] nums = new int[26];
        for (char c : t.toCharArray()) {
            nums[c - 'a']++;
        }

        int ans = 0;
        for (char c : s.toCharArray()) {
            nums[c - 'a']--;
        }

        for (int i = 0; i < 26; i++) {
            if (nums[i] > 0) {
                ans += nums[i];
            }
        }
        return ans;
    }
}

709、转换成小写字母

 强化复习:A-Z的ASCII是65~90 。a-z的ASCII是97~122

class Solution {
    public String toLowerCase(String s) {
        char[]c=s.toCharArray();
        for(int i=0;i<c.length;i++){
            if(c[i]>='A'&&c[i]<='Z'){
                c[i]+=32;
            }
        }
        return String.valueOf(c);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值