—— 25.1.23
1512. 好数对的数目
给你一个整数数组
nums。如果一组数字
(i,j)满足nums[i]==nums[j]且i<j,就可以认为这是一组 好数对 。返回好数对的数目。
示例 1:
输入:nums = [1,2,3,1,1,3] 输出:4 解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始示例 2:
输入:nums = [1,1,1,1] 输出:6 解释:数组中的每组数字都是好数对示例 3:
输入:nums = [1,2,3] 输出:0
方法一 暴力遍历
思路与算法
双重循环进行遍历,判断nums[i] == nums[j]时,计数变量sum+1,当双重循环进行遍历完成后,返回计数变量sum
Python实现
class Solution:
    def numIdenticalPairs(self, nums: List[int]) -> int:
        sum = 0
        for i in range(len(nums)):
            for j in range(i + 1,len(nums)):
                if nums[i] == nums[j]:
                    sum += 1
        return sum
        
Java实现
class Solution {
    public int numIdenticalPairs(int[] nums) {
        int i = 0;
        int j = 0;
        int num = 0;
        for(i = 0; i < nums.length; i++){
            for(j = i + 1; j < nums.length; j++){
                if(nums[i] == nums[j]){
                    num += 1;
                } 
            }
        }
        return num;
    }
}
方法二 字典 + 哈希表
思路与算法
如果一个元素在数组中出现 k 次,则选择两个元素组成好数对的方案数是: k × (k−1) / 2因此该元素对应的好数对的数目是: k × (k−1) / 2
因此,只要得到每个元素在数组中的出现次数,分别计算每个元素对应的好数对的数目,即可得到数组中的好数对的数目。
Python实现
values():返回一个视图对象,该对象包含了字典中所有的值。借助这个视图对象,你能够遍历字典里的所有值,并且它会动态地反映出字典的变化。
keys():返回一个视图对象,该视图对象包含了字典中所有的键
class Solution:
    def numIdenticalPairs(self, nums: List[int]) -> int:
        res = {}
        sum = 0
        for i in nums:
            if i not in res.keys():
                res[i] = 1
            else:
                res[i] += 1
        for j in res.values():
            if j != 1:
                sum += j * (j-1) // 2
        return sum
            

Java实现
getOrDefault():Map 接口定义了 getOrDefault 方法,该方法的作用是从 Map 中获取指定键对应的值。若该键存在于 Map 中,就返回其对应的值;若键不存在,则返回预先指定的默认值。这一方法能避免在使用 get 方法时手动检查键是否存在并提供默认值的繁琐操作。
entrySet():用于返回一个包含 Map 中所有键值对(即 Map.Entry 对象)的 Set 集合视图。Map.Entry 是 Map 接口的一个内部接口,它代表了 Map 中的一个键值对,其中包含了键和对应的值。
getValue() :getValue() 是 Map.Entry 接口所定义的方法,其作用是获取当前键值对中的值。
class Solution {
    public int numIdenticalPairs(int[] nums) {
        HashMap<Integer, Integer> res = new HashMap<>();
        for(int num: nums){
            res.put(num, res.getOrDefault(num, 0) + 1);
        }
        Set<Map.Entry<Integer, Integer>> entries = res.entrySet();
        int sum = 0;
        for (Map.Entry<Integer, Integer> entry : entries) {
            int count = entry.getValue();
            sum += count * (count - 1) / 2;
        }
        return sum;
    }
}
1534. 统计好三元组
给你一个整数数组
arr,以及a、b、c三个整数。请你统计其中好三元组的数量。如果三元组
(arr[i], arr[j], arr[k])满足下列全部条件,则认为它是一个 好三元组 。
0 <= i < j < k < arr.length
|arr[i] - arr[j]| <= a
|arr[j] - arr[k]| <= b
|arr[i] - arr[k]| <= c其中
|x|表示x的绝对值。返回 好三元组的数量 。
示例 1:
输入:arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3 输出:4 解释:一共有 4 个好三元组:[(3,0,1), (3,0,1), (3,1,1), (0,1,1)] 。示例 2:
输入:arr = [1,1,2,2,3], a = 0, b = 0, c = 1 输出:0 解释:不存在满足所有条件的三元组。
方法一 暴力遍历
思路与算法
Python实现
abs(): 是一个内置函数,用于返回一个数的绝对值。绝对值指的是一个数在数轴上所对应点到原点的距离,所以绝对值一定是非负的。
class Solution:
    def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
        res = 0
        for i in range(len(arr)):
            for j in range(i + 1, len(arr)):
                for k in range(j + 1, len(arr)):
                    if abs(arr[i] - arr[j]) <= a and abs(arr[j] - arr[k]) <= b and abs(arr[i] - arr[k]) <= c:
                        res = res + 1
        return res
        
Java实现
Math.abs(): 是 Java 中的一个静态方法,它属于 java.lang.Math 类,主要用于返回一个数的绝对值。绝对值是指一个数在数轴上所对应点到原点的距离,所以其结果总是非负的。
class Solution {
    public int countGoodTriplets(int[] arr, int a, int b, int c) {
        int res = 0;
        for(int i = 0; i < arr.length; i++){
            for(int j = i + 1; j < arr.length; j++){
                for(int k = j + 1; k < arr.length; k++){
                    if(Math.abs(arr[i] - arr[j]) <= a && Math.abs(arr[j] - arr[k]) <= b && Math.abs(arr[i] - arr[k]) <= c){
                        res += 1;
                    }
                }
            }
        }
        return res;
    }
}
709. 转换成小写字母
示例 1:
输入:s = "Hello" 输出:"hello"示例 2:
输入:s = "here" 输出:"here"示例 3:
输入:s = "LOVELY" 输出:"lovely"提示:
1 <= s.length <= 100
s由 ASCII 字符集中的可打印字符组成
方法一 遍历判断处理
思路与算法
遍历字符串,判断每个字符是否为大写字母,如果是的话就转换为小写字母(ASCI码值加32),本身是小写字母就不用转换,最后将各个字符组装成字符串输出。
Python实现
ord():函数用于返回一个字符的 Unicode 码点(整数表示)。Unicode 是一种国际编码标准,它为世界上几乎所有的字符都分配了一个唯一的数字编号,这个编号就是码点
chr():函数与 ord() 函数相反,它接受一个整数(Unicode 码点)作为参数,并返回对应的字符
append():是列表(list)对象的一个方法,用于在列表的末尾添加一个新的元素。该操作会直接修改原列表,而不会返回一个新的列表。
join():是字符串对象的一个方法,用于将一个可迭代对象(如列表、元组等)中的元素以指定的字符串为分隔符连接成一个新的字符串
class Solution:
    def toLowerCase(self, str: str) -> str:
        res = []
        for i in str:
            if 65 <= ord(i) <= 90:
                res.append(chr(ord(i) + 32))
            else:
                res.append(i)
        return "".join(res)
Java实现
charAt():是 String 类的一个实例方法,其作用是返回字符串中指定索引位置的字符。索引从 0 开始计数,即第一个字符的索引为 0,第二个字符的索引为 1,依此类推。
(char)():(char)() 属于强制类型转换操作。它可以把其他基本数据类型(像 int、byte、short 等)转换为 char 类型。
append():append() 方法可以将各种类型的数据添加到 StringBuilder 或 StringBuffer 对象的末尾
toString():该方法的作用是返回对象的字符串表示形式。许多类会重写这个方法,以提供更有意义的字符串表示。
class Solution {
    public String toLowerCase(String s) {
        StringBuilder str = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            if(ch >= 65 && ch <= 90){
                ch = (char)(ch+32);
            }
            str.append(ch);
        }
        return str.toString();
    }
}
方法二 转小写API
思路与算法
使用语言自带的大写字母转小写字母的 API
Python实现
lower():把字符串中的所有大写字母转换为小写字母,而字符串中的其他字符(如小写字母、数字、标点符号等)保持不变。该方法不会修改原字符串,而是返回一个新的字符串。
class Solution:
    def toLowerCase(self, s: str) -> str:
        return s.lower()
Java实现
toLowerCase():其功能是把字符串中的所有大写字母转换为小写字母,同样不会修改原字符串,而是返回一个新的字符串。
class Solution {
    public String toLowerCase(String s) {
        return s.toLowerCase();
    }
} 
 



















