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;
}
}
LeetCode第189题:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
解析:此题的解法有很多,这里介绍一种反转数组的方法具体步骤是:
- 反转数组总所有数字 ;
- 反转前 k 个数字;
- 反转后 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题:反转一个单链表
解析:
- 把当前节点的 next 指针指向其前驱节点;
- 把前驱节点指针指向当前节点;
- 把当前节点指针指向其下一个节点。
代码如下:
// 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