Java练习day3

一、验证回文串

1、题目链接

点击跳转到题目位置

2、代码

class Solution {
    public boolean judge(char ch){
        if((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')){
            return true;
        }
    return false;
    }

    public boolean judge1(char ch1, char ch2){
        if(ch1 == ch2){         
            return true;
        }
    return false;
    }

    public boolean isPalindrome(String s) {
        int left = 0;
        int n = s.length();
        int right = n - 1;
        s = s.toLowerCase();
        while(left <= right){
            while(left < n && (judge(s.charAt(left)) == false)){
                ++left;
            }
            while(right >= 0 && (judge(s.charAt(right)) == false)){
                --right;
            }
            if(left > right){
                break;
            }
            if(judge1(s.charAt(left), s.charAt(right)) == false){
                return false;
            } 
            ++left;
            --right;
        }
    return true;
    }
}

3.知识点

(1) Java如何将字符串从小写转化为大写,从大鞋转化为小写。
(2) 回文的基本概念。
(3) 利用双指针来解决问题。

二、环形链表

1、题目链接

点击跳转到题目位置

2、代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode head1 = head;
        ListNode head2 = head;
        while(head1 != null && head1.next != null){
            head1 = head1.next;
            if(head1 == head2){
                return true;
            }
            head1 = head1.next;
            if(head1 == head2){
                return true;
            }
            head2 = head2.next;
        }
    return false;
    }
}

3.知识点

(1) 链表方面的题目
(2) 使用快慢指针来解决问题。

三、二叉树的前序遍历

1、题目链接

点击跳转到题目位置

2、代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    public void dfs(TreeNode root, List<Integer> res){
        if(root == null){
            return ;
        }
        res.add(root.val);
        dfs(root.left, res);
        dfs(root.right, res);
    }

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        dfs(root, res);
    return res;
    }
}

3.知识点

(1) 树的先序遍历,记住是根左右的顺序。
(2) 利用递归直接解决。

四、二叉树的后序遍历

1、题目链接

点击跳转到题目位置

2、代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public void dfs(TreeNode root, List<Integer> res){
        if(root == null){
            return; 
        }
        dfs(root.left, res);
        dfs(root.right, res);
        res.add(root.val);
    }

    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList();
        dfs(root, res);
    return res;
    }
}

3.知识点

(1) 树的后序遍历,记住是左右根的顺序。
(2) 利用递归直接解决。

五、相交链表

1、题目链接

点击跳转到题目位置

2、代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode head1 = headA;
        ListNode head2 = headB;
        int flag1 = 0;
        int flag2 = 0;
        while(head1 != null && head2 != null){
            if(head1 == head2){
                return head1;
            }
            if(head1.next == null && flag1 == 0){
                head1 = headB;
                flag1 = 1;
            } else{
                head1 = head1.next;
            } 
            if(head2.next == null && flag2 == 0){
                head2 = headA;
                flag2 = 1;
            } else{
                head2 = head2.next;
            }
        }
    return null;
    }
}

3.知识点

(1) 使用双指针从两个链表头开始形式,然后到达终点后再到达另一条链表的头,再到另一条链表的结尾。
(2) 如果该过程两个指针相遇则代表有公共结点。

六、Excel表列名称

1、题目链接

点击跳转到题目位置

2、代码

class Solution {
    public String convertToTitle(int columnNumber) {
        StringBuffer res = new StringBuffer();
        while(columnNumber != 0){
            columnNumber--;
            int num = columnNumber % 26;
            columnNumber /= 26;
            res.append((char)(num  + 'A'));
        }
    return res.reverse().toString();
    }
}

3.知识点

(1) 比较充满数学性的题目。

七、多数元素

1、题目链接

点击跳转到题目位置

2、代码

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
}

3.知识点

(1) 排序,取中位数即可。

八、Excel 表列序号

1、题目链接

点击跳转到题目位置

2、代码

class Solution {
    public int titleToNumber(String columnTitle) {
        int res = 0;
        int n = columnTitle.length();
        for(int i = 0; i < n; ++i){
            res *= 26;
            res += (columnTitle.charAt(i) - 'A' + 1);
        }
    return res;
    }
}

3.知识点

(1) 和第七条一样,反向推理。

九、颠倒二进制位

1、题目链接

点击跳转到题目位置

2、代码

public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        int res = 0;
        for(int i = 0; i < 32; ++i){
            if(((1 << (31 - i)) & n) != 0){
                res += (1 << i);
            }
        }
    return res;
    }
}

3、知识点

(1) 考察了关于位运算相关知识。

十、位1的个数

1、题目链接

点击跳转到题目位置

2、代码

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ret = 0;
        while(n != 0){
            n &= (n - 1);
            ret++;
        }
    return ret;
    }
}

3、知识点

(1) 关于汉明编码的一些优化。

十一、快乐数

1、题目链接

点击跳转到题目位置

2、代码

class Solution {

    public int get_num(int n){
        int sum = 0;
        while(n != 0){
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
    return sum;
    }

    public boolean isHappy(int n) {
        Set<Integer> hash1 = new HashSet<>();
        while(n != 1 && !hash1.contains(n)){
            hash1.add(n);
            n = get_num(n);
        }
    return n == 1;
    }
}

3、知识点

(1) 利用哈希表,每次模拟过程,如果模拟的过程中到达1或者到达过去已经到达过的数字就停止。

十二、移除链表元素

1、题目链接

点击跳转到题目位置

2、代码

/**
 * Definition for singly-linked list.
 * public 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 ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return head;
        }
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;
        head = dummyHead;
        while(head.next != null){
            if(head.next.val == val){
                head.next = head.next.next;
            } else{
                head = head.next;
            }
        }
    return dummyHead.next;
    }
}

3、知识点

(1) 链表中增删改查中删的操作。

十三、同构字符串

1、题目链接

点击跳转到题目位置

2、代码

class Solution {
    public boolean isIsomorphic(String s, String t) {
        Map<Character, Character> hash1 = new HashMap<Character, Character>();
        Map<Character, Character> hash2 = new HashMap<Character, Character>();
        for(int i = 0; i < s.length(); ++i){
            char ch1 = s.charAt(i);
            char ch2 = t.charAt(i);
            if(hash1.containsKey(ch1) && hash1.get(ch1) != ch2 
            || hash2.containsKey(ch2) && hash2.get(ch2) != ch1){
                return false;
            }
            hash1.put(ch1, ch2);
            hash2.put(ch2, ch1);
        }
        return true;
    }
}

3、知识点

(1) 实际上是利用两个哈希表来判断函数是否是双射关系。

十四、反转链表

1、题目链接

点击跳转到题目位置

2、代码

/**
 * Definition for singly-linked list.
 * public 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 ListNode reverseList(ListNode head) {
        ListNode dummyHead = new ListNode();
        while(head != null){
            ListNode temp = head.next;
            head.next = dummyHead.next;
            dummyHead.next = head;
            head = temp;
        }
    return dummyHead.next;
    }
}

3、知识点

(1) 链表的头插法得到相反的序列。

十五、存在重复元素

1、题目链接

点击跳转到题目位置

2、代码

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> hash1 = new HashSet<>();
        for(int i = 0; i < nums.length; ++i){
            if(hash1.contains(nums[i])){
                return true;
            }
            hash1.add(nums[i]);
        }
    return false;
    }
}

3、知识点

(1) 使用哈希表解决。

你可能感兴趣的:(Java,java,leetcode)