每日一练<4>

每日一练

大家好呀!我是小笙,接下来分享下11-12月份每日一题的解题思路~

1822. 数组元素积的符号

给定一个数组,将数组中的每个值乘积起来如果等于 0 则返回 0;如果大于 0 则返回 1;如果小于 0 则返回 -1

例子

输入:nums = [41,65,14,80,20,10,55,58,24,56,28,86,96,10,3,84,4,41,13,32,42,43,83,78,82,70,15,-41]、
输出:-1
注意:会超出 int 类型的范围

暴力破解,但是注意不能直接累积的方式判断,因为会超出 int 数据范围

class Solution {
    public int arraySign(int[] nums) {
        int res = 0;
        for(int num:nums){
            if(num == 0){
                return 0;
            }else if(num < 0){
                res++;
            }
        }
        return res%2 == 1?-1:1;
    }
}

1662. 检查两个字符串数组是否相等

给你两个字符串数组 word1word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false

例子

输入:word1 = ["ab", "c"], word2 = ["a", "bc"]
输出:true
解释:
word1 表示的字符串为 "ab" + "c" -> "abc"
word2 表示的字符串为 "a" + "bc" -> "abc"
两个字符串相同,返回 true
-------------------------------------------
输入:word1 = ["a", "cb"], word2 = ["ab", "c"]
输出:false

代码实现

暴力解法:首先记录下一组字符串的字符和,然后去和另外一个数组进行比较;但是需要注意的是两者字符串总长度大小的两种情况

class Solution {
    public boolean arrayStringsAreEqual(String[] word1, String[] word2) {
        StringBuilder sb = new StringBuilder("");
        for(String word:word1){
            sb.append(word);
        }
        int index = 0;
        String str = sb.toString();
        for(String word:word2){
            for(int i=0;i<word.length();i++){
                // 防止第一个字符串长度小于第二个字符串的长度
                if(index >= str.length()){
                    return false;
                }
                if(str.charAt(index++) != word.charAt(i)){
                    return false;
                }
            }
        }
        // 防止第一个字符串长度大于第二个字符串的长度
        if(index != str.length()){
            return false;
        }
        return true;
    }
}

优化:通过下标的方式直接累积两者字符串,然后直接比较就可以啦

class Solution {
    public boolean arrayStringsAreEqual(String[] word1, String[] word2) {
        StringBuilder sb = new StringBuilder("");
        StringBuilder sb2 = new StringBuilder("");
        int index1 = 0,index2 = 0;
        while(index1 < word1.length || index2 < word2.length){
            if(index1 < word1.length){
                sb.append(word1[index1++]);
            }
            if(index2 < word2.length){
                sb2.append(word2[index2++]);
            }
        }
        return sb.toString().equals(sb2.toString());
    }
}

// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:39.2 MB, 在所有 Java 提交中击败了76.54%的用户

1668.最大重复子字符串

给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k 。单词 word 的 最大重复值是单词 wordsequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k0

例子

输入:sequence = "aaabaaaabaaabaaaabaaaabaaaabaaaaba", word = "aaaba"
输出:5
解释:注意是连续重复最大值

解题思路:使用 String 包含的方法来查找连续重复最大值

class Solution {
    public int maxRepeating(String sequence, String word) {
        int res = 0;
        StringBuilder sb = new StringBuilder(word);
        while(sequence.contains(sb.toString())){
            res++;
            sb.append(word);
        }
        return res;
    }
}

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

示例 :

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

代码实现

解题思路:就是边放便查询,为啥不会漏放呢,我们查询的都是成对出现的,也就是说我们把第一个就直接放进去,那查第二个数字 (target - 第一个数字) 一定会返回

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(map.containsKey(target - nums[i])){
                return new int[]{map.get(target - nums[i]),i};
            }
            map.put(nums[i],i);
        }
        return new int[]{-1,-1};
    }
}

1796.字符串中第二大的数字

给你一个混合字符串(由小写英文字母和数字组成) s ,请你返回 s第二大 的数字,如果不存在第二大的数字,请你返回 -1

示例:

输入:s = "dfa12321afd"
输出:2
解释:出现在 s 中的数字包括 [1, 2, 3] 。第二大的数字是 2

代码实现:

解题思路:统计字符串有哪些数字,并收集不重复的数字;如果最后长度小于2 返回-1,反之排序返回第二大的数字

class Solution {
    public int secondHighest(String s) {
        Set<Integer> set = new HashSet<>();
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(ch >= 48 && ch <= 58 && !set.contains(ch-48)){
                list.add(ch-48);
                set.add(ch-48);
            }
        }
        if(list.size() < 2){
            return -1;
        }
        Collections.sort(list);
        return list.get(list.size()-2);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al_tair

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值