银联-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);
}
}