【LeetCode系列】:编程能力提升(4)

本文介绍了编程实战中的四个经典问题:计算数组元素积的符号、判断数列是否等差、快乐数算法实现及仅一次交换使字符串相等。提供了两种解题思路和源代码示例,适合提升算法理解与编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🍀循环

题目链接:
T1:1822. 数组元素积的符号
T2:1502. 判断能否形成等差数列
T3:202. 快乐数
T4:1790. 仅执行一次字符串交换能否使两个字符串相等

T1:数组元素积的符号

📚题目详情

在这里插入图片描述

💡解题思路一

将数组所有数相乘然后判断正负。
注意:需要考虑mul的范围,由题可知最大数据范围是100的1000次方,所以需要将数据类型定义为double。

🔑源代码一

class Solution {
    public int arraySign(int[] nums) {
        double mul=1;
        for(int i=0;i<nums.length;i++){
            mul *= nums[i];
        }
        if(mul>0){
            return 1;
        }else if(mul<0){
            return -1;
        }
        return 0;
    }
}

💡解题思路二(推荐)

遍历数组有以下场景

  • 遇到0,直接返回
  • 小于0,结果乘之

🔑源代码二

class Solution {
    public int arraySign(int[] nums) {
        int sign = 1;
        for (int n : nums) {
            if (n == 0) {
                return 0;
            }
            if (n < 0) {
                sign *= -1;
            }
        }
        return sign;
    }
}

T2:判断能否形成等差数列

📚题目详情

在这里插入图片描述

💡解题思路一

按照等差数列的定义去求解,等差数列至少要有三项,望知晓。
在这里插入图片描述
用前一项减后一项去求差d,然后逐个比较是否所有前一项减后一项的差相等。

🔑源代码一

class Solution {
    public boolean canMakeArithmeticProgression(int[] arr) {
        int sum = 0;
        Arrays.sort(arr);
        for (int i = arr.length - 1; i >= 2; i--) {
             if (arr[i] - arr[i - 1] == arr[i - 1] - arr[i - 2]) {
                 sum++;
            }
        }
        if (sum == arr.length - 2) {
                return true;
            } 
        return false;
    }
}

💡解题思路二(推荐)

在这里插入图片描述

🔑源代码二

class Solution {
    public boolean canMakeArithmeticProgression(int[] arr) {
        Arrays.sort(arr);
        for (int i = 1; i < arr.length - 1; ++i) {
            if (arr[i] * 2 != arr[i - 1] + arr[i + 1]) {
                return false;
            }
        }
        return true;
    }
}

T3: 快乐数(好题)

📚题目详情

在这里插入图片描述

💡解题思路

详情请见:LeetCode题解
在这里插入图片描述

🔑源代码

class Solution {
    private int getNext(int n) {
        int totalSum = 0;
        while (n > 0) {
            int d = n % 10;
            n = n / 10;
            totalSum += d * d;
        }
        return totalSum;
    }

    public boolean isHappy(int n) {
        Set<Integer> seen = new HashSet<>();
        while (n != 1 && !seen.contains(n)) {
            seen.add(n);
            n = getNext(n);
        }
        return n == 1;
    }
}

T4:仅执行一次字符串交换能否使两个字符串相等(好题)

📚题目详情

在这里插入图片描述

💡解题思路

在这里插入图片描述

🔑源代码

class Solution {
    public boolean areAlmostEqual(String s1, String s2) {
        int cnt = 0;
        int len = s1.length();
        int[] map = new int[26];
        char[] chas1 = s1.toCharArray();
        char[] chas2 = s2.toCharArray();
        for (char ch : chas1) {
            map[ch - 'a']++;
        }

        for (char ch : chas2) {
            if (map[ch - 'a']-- == 0) {//先判断,再--,防止影响后面的判断如“yj”,"yy"如果不--就会影响结果
                return false;
            }
        }

        for (int i = 0; i < len; ++i) {
            if (chas1[i] != chas2[i]) {
                cnt++;
            }
        }

        return cnt <= 2;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值