Java每日一练(20230515) 阶乘后的零、矩阵置零、两数相除

简介: Java每日一练(20230515) 阶乘后的零、矩阵置零、两数相除

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:

a9dfa884d1a855d6630087aa890a20f8.jpeg

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]

输出:[[1,0,1],[0,0,0],[1,0,1]]


示例 2:

816bcf700b7a5b0c1b118f9aaac5bb58.jpeg

输入: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


目录
相关文章
数值的整数次方(剑指offer 16)Java快速幂
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
166 0
|
存储 JavaScript 前端开发
数据结构与算法 -4、5 :两数相加&&两数之和
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
|
存储
每日一题(两数相加)
每日一题(两数相加)
|
Java
java求1至19这些自然数数中,所有相加为20的组合
使用Stack来完成: 代码如下: package ca.map; import java.util.Stack; public class Sum1_19eq20 { //算法: 求1至19这些自然数数中,所有相加为20的组合 public static void main(String[] args) { combinateDataOfRang
1824 0
|
11月前
|
Go Python Java
Python每日一练(20230408) 两数相除、分割回文串、x 的平方根
Python每日一练(20230408) 两数相除、分割回文串、x 的平方根
75 0
Python每日一练(20230408) 两数相除、分割回文串、x 的平方根
|
存储 Rust 算法
Rust每日一练(leetDay0001) 两数之和、两数相加、最长子串
Rust每日一练(leetDay0001) 两数之和、两数相加、最长子串
131 0
|
算法 搜索推荐 Java
冒泡排序算法 递归算法,求n的阶乘 求最大公约数和最小公倍数 java分解质因数
<p> </p> <p>   1.  /** </p> <p>   2.  * 冒泡排序算法 </p> <p>   3.  */  </p> <p>   4. public class BubbleSort {  </p> <p>   5.     public static void sort(int[] values) {  </p> <p>   6.         int
2394 0
|
算法 程序员 C语言
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
|
11月前
|
存储 Java
Java判断质数、求所有约数【蓝桥杯常用方法】
Java判断质数、求所有约数【蓝桥杯常用方法】
|
11月前
|
Java
Java练习题-输出斐波那契(Fibonacci)数列
Java练习题-输出斐波那契(Fibonacci)数列
104 1