1. 阶乘后的零
给定一个整数 n
,返回 n!
结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
示例 1:
输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
示例 2:
输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
示例 3:
输入:n = 0
输出:0
提示:
0 <= n <= 10^4
进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?
出处:
https://edu.csdn.net/practice/27859948
代码:
import java.util.*; public class Solution { public static int trailingZeroes(int n) { int count = 0; while (n >= 5) { count += n / 5; n /= 5; } return count; } public static void main(String[] args) { System.out.println(trailingZeroes(3)); System.out.println(trailingZeroes(5)); System.out.println(trailingZeroes(0)); System.out.println(trailingZeroes(20)); } }
输出:
0
1
0
4
2. 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
进阶:
一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗?
示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
提示:
m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
出处:
https://edu.csdn.net/practice/27859949
代码:
import java.util.*; public class Solution { public static void setZeroes(int[][] matrix) { int[] xNum = new int[matrix[0].length]; int[] yNum = new int[matrix.length]; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { if (matrix[i][j] == 0) { xNum[j] = 1; yNum[i] = 1; } } } for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { if (xNum[j] == 1 || yNum[i] == 1) { matrix[i][j] = 0; } } } } public static void main(String[] args) { int[][] matrix = {{1,1,1},{1,0,1},{1,1,1}}; setZeroes(matrix); System.out.println(Arrays.deepToString(matrix)); int[][] matrix2 = {{0,1,2,0},{3,4,5,2},{1,3,1,5}}; setZeroes(matrix2); System.out.println(Arrays.deepToString(matrix2)); } }
输出:
[[1, 0, 1], [0, 0, 0], [1, 0, 1]]
[[0, 0, 0, 0], [0, 4, 5, 0], [0, 3, 1, 0]]
3. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2
提示:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
出处:
https://edu.csdn.net/practice/27859950
代码:
import java.util.*; public class Solution { public static int divide(int dividend, int divisor) { if (dividend == 0) { return 0; } if (dividend == Integer.MIN_VALUE && divisor == -1) { return Integer.MAX_VALUE; } boolean negative; negative = (dividend ^ divisor) < 0; long t = Math.abs((long) dividend); long d = Math.abs((long) divisor); int result = 0; for (int i = 31; i >= 0; i--) { if ((t >> i) >= d) { result += 1 << i; t -= d << i; } } return negative ? -result : result; } public static void main(String[] args) { System.out.println(divide(10, 3)); System.out.println(divide(7, -3)); } }
输出:
3
-2