自学内容网 自学内容网

力扣刷题 day2

快乐数

202. 快乐数 - 力扣(LeetCode)

在这里插入图片描述

图:

在这里插入图片描述
在这里插入图片描述

java

  // 快乐数 --> 19 => 1^2 + 9 ^2 = 82 => 82 => 8 ^ 2 + 2 ^ 2  ......
    public boolean isHappy(int n) {
        // 使用快慢指针
        int slow = n, fast = getSum(n);
        while (slow != fast) {
            slow = getSum(slow);
            fast = getSum(getSum(fast));
        }
        return slow == 1;
    }

    // 返回 n 这个数每一位的平方和
    public int getSum(int n) {
        int sum = 0;
        while (n != 0) {
            // 获取导最后一位
            int t = n % 10;
            // 相当于 每个位子 n 平方
            sum += t * t;
            n /= 10;
        }
        return sum;
    }

python:

class Solution(object):
    def isHappy(self, n):
        show = n
        fast = self.getSum(n)
        while show != fast:
            show = self.getSum(show)
            fast = self.getSum(self.getSum(fast))
        return show == 1

    # 获取 平方和
    def getSum(self, n):
        sum = 0
        while n != 0:
            t = n % 10
            sum = t * t + sum
            n = n / 10
        return sum

这里还有一个取巧的方法,本体难点就是不是 快乐数的进行平方运算会出现循环的情况吗 ,那么我们使用一个 计数器 ,记录下每次平方的次数,然后规定一个值,只要计数器等于这个值后 ,就直接返回 false , 说明不是 快乐数

 public boolean isHappy(int n) {
        int count = 0;
        int ret = 0;
        while (true) {
            int a = n % 10;
            n /= 10;
            // 相当于 平方操作
            count += a * a;
            if (n == 0) {
                //此时说明是快乐数
                if (count == 1) {
                    return true;
                } else {
                    // 此时不是快乐数对计数器进行++
                    ret++;
                    // 对非快乐书 再次进行规则运算
                    n = count;
                    count = 0;
                }
            }
            // 此时 给 一个指定值 表示结束情况
            if (ret == 10) {
                // 此时 10 次,差不多就可以校验出当前这个数是否为快乐数了
                return false;
            }
        }
    }

盛最多水的容器

盛最多水的容器

在这里插入图片描述

图一:

在这里插入图片描述

图二:

在这里插入图片描述

java:

 // 单调性+双指针
    public static int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int maxCubage = 0;
        while (left != right) {
            int nowWidth = right - left;
            // 取最小值
            if (height[left] < height[right]) {
                maxCubage = Math.max(height[left] * nowWidth, maxCubage);
                left++;
            } else {
                maxCubage = Math.max(height[right] * nowWidth, maxCubage);
                right--;
            }
        }
        return maxCubage;
    }

python:

class Solution(object):
    def maxArea(self, height):
        left = 0
        right = len(height) - 1
        maxNumber = 0
        while left < right:
            maxNumber = max(min(height[left], height[right]) * (right - left), maxNumber)
            if height[left] < height[right]:
                left += 1
            else:
                right -= 1
        return maxNumber

原文地址:https://blog.csdn.net/mu_tong_/article/details/138923520

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!