LeetCode之反转

LeetCode第7题:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转

解析:不断的取模运算即可,不过还需要考虑数值溢出的问题

代码如下:

public int reverse(int x) {
    long n = 0;
    while(x != 0){
        n = n * 10 + x % 10;
        x = x / 10;   
    }
    if((int) n != n){//数据已经溢出
        return 0;
    }else{
        return (int)n;
    }
}

详细的解题过程可参见:https://leetcode-cn.com/problems/reverse-integer/solution/tu-jie-7-zheng-shu-fan-zhuan-by-wang_ni_ma/

LeetCode第189题:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数

解析:此题的解法有很多,这里介绍一种反转数组的方法具体步骤是:

  1. 反转数组总所有数字 ;
  2. 反转前 k 个数字;
  3. 反转后 n-k 个数字。

代码如下:

public void rotate(int[] nums, int k) {
    k = k % nums.length;
    reverse(nums, 0, nums.length - 1);//反转数组中的所有元素
    reverse(nums, 0, k - 1);//反转数组中的前k个元素
    reverse(nums, k, nums.length - 1);//反转数组中的后k个元素
}
public void reverse(int[] nums, int start, int end){
    while(start <= end){
        int temp = nums[start];//交换数组中的前面和末尾的数
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}

详细的解题过程可以参见:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/

LeetCode第226题:翻转一棵二叉树

解析:使用递归,每一次遍历交换左右节点即可

代码如下:

public TreeNode invertTree(TreeNode root) {
    if(root == null)
        return null;
        //交换根节点的左右节点
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        invertTree(root.right);
        invertTree(root.left);
        return root;
}

LeetCode第234题:反转一个单链表

解析:

  1. 把当前节点的 next 指针指向其前驱节点;
  2. 把前驱节点指针指向当前节点;
  3. 把当前节点指针指向其下一个节点。

代码如下:

//     public ListNode reverseList(ListNode head) {
//         ListNode prev = null; //前指针节点
//         ListNode curr = head; //当前指针节点
//         //每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移
//         while (curr != null) {
//             ListNode nextTemp = curr.next; //临时节点,暂存当前节点的下一节点,用于后移
//             curr.next = prev; //将当前节点指向它前面的节点
//             prev = curr; //前指针后移
//             curr = nextTemp; //当前指针后移
//         }
//         return prev;
//     }

详细的解题过程可以参见:https://segmentfault.com/a/1190000021364359

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值