力扣刷题 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
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值