每日刷题记录(十七)

这篇具有很好参考价值的文章主要介绍了每日刷题记录(十七)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一题:求1+2+…+n

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

解题思路:

本题需要用到逻辑运算符的短路性质。以逻辑运算符&&为例,对于A && B这个表达式,如 A表达式返回False ,那么 A && B 已经确定为False ,此时不会去执行表达式B。利用这一特性,我们可以将判断是否为递归的出口看作A && B表达式中的A部分,递归的主体函数看作B部分。如果不是递归出口,则返回True,并继续执行表达式B的部分,否则递归结束

代码实现:

class Solution {
    public int sumNums(int n) {
        boolean flg = n > 0 && (n += sumNums(n-1)) > 0;
        return n; 
    }
}

第二题:两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

解题思路:

通过递归的方式实现两两交换链表中的节点。
递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。
如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。用head表示原始链表的头节点,新的链表的第二个节点,用newHead表示新的链表的头节点,原始链表的第二个节点,则原始链表中的其余节点的头节点是newHead.next。令head.next =swapPairs(newHead.next),表示将其余节点进行两两交换,交换后的新的头节点为head的下一个节点。然后令newHead.next = head,即完成了所有节点的交换。最后返回新的链表的头节点newHead。

代码实现:

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode newHead = head.next;
        head.next = swapPairs(newHead.next);
        newHead.next = head;
        return newHead;
    }
}

第三题:只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

提示:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

解题思路:

使用哈希映射统计数组中每个元素的出现次数。对于哈希映射中的每个键值对,键表示一个元素,值表示其出现的次数。在统计完成后,我们遍历哈希映射即可找出只出现一次的元素

代码实现:

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int num : nums) {
            map.put(num,map.getOrDefault(num,0)+1);
        }
        int ret = 0;
        for(Map.Entry<Integer,Integer> entry : map.entrySet()) {
            int key = entry.getKey();
            int val = entry.getValue();
            if(val == 1) {
                ret = key;
                break;
            }
        }
        return ret;
    }
}

第四题:根据字符串出现频率排序

给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。

返回 已排序的字符串 。如果有多个答案,返回其中任何一个。

示例 1:

输入: s = “tree”
输出: “eert”
解释: 'e’出现两次,'r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。

示例 2:

输入: s = “cccaaa”
输出: “cccaaa”
解释: 'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。

示例 3:

输入: s = “Aabb”
输出: “bbAa”
解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意’A’和’a’被认为是两种不同的字符。

提示:

  • 1 <= s.length <= 5 * 105
  • s 由大小写英文字母和数字组成

解题思路:

首先遍历字符串,统计每个字符出现的频率,然后每次得到频率最高的字符,生成排序后的字符串。可以使用哈希表记录每个字符出现的频率,将字符去重后存入列表,再将列表中的字符按照频率降序排序。生成排序后的字符串时,遍历列表中的每个字符,则遍历顺序为字符按照频率递减的顺序。对于每个字符,将该字符按照出现频率拼接到排序后的字符串。例如,遍历到字符cc,该字符在字符串中出现了freq次,则将freq个字符cc拼接到排序后的字符串

代码实现:

class Solution {
    public String frequencySort(String s) {
         Map<Character,Integer> map = new HashMap<>();
        int len = s.length();
        for(int i = 0;i < len;i++) {
            char ch = s.charAt(i);
            map.put(ch,map.getOrDefault(ch,0)+1);
        }
        List<Character> list = new ArrayList<>(map.keySet());
        Collections.sort(list,(a,b) -> map.get(b) -map.get(a));
        StringBuilder ret = new StringBuilder();
        for(int i = 0;i < list.size();i++) {
            char ch = list.get(i);
            int fre = map.get(ch);
            for(int j = 0;j < fre;j++) {
                ret.append(ch);
            }
        }
        return ret.toString();
    }
}

第五题:字母大小写全排列

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。

返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

示例 1:

输入:s = “a1b2”
输出:[“a1b2”, “a1B2”, “A1b2”, “A1B2”]

示例 2:

输入: s = “3z4”
输出: [“3z4”,“3Z4”]

提示:

  • 1 <= s.length <= 12
  • s 由小写英文字母、大写英文字母和数字组成

解题思路:

通过递归实现,从左往右依次遍历字符,过程中保持 ans 为已遍历过字符的字母大小全排列。例如,当S=“abc"时,考虑字母 “a”, “b”, “c”,初始令 ans=[”"],依次更新 ans = [“a”, “A”],ans=[“ab”, “Ab”, “aB”, “AB”], ans=[“abc”,“Abc”, “aBc”, “ABc”, “abC”, “AbC”, “aBC”, “ABC”]。文章来源地址https://www.toymoban.com/news/detail-421906.html

代码实现:

class Solution {
    public List<String> letterCasePermutation(String s) {
        List<StringBuilder> ans = new ArrayList<>();
        ans.add(new StringBuilder());
        for(char ch : s.toCharArray()) {
            int n = ans.size();
            if(Character.isLetter(ch)) {
                for(int i = 0;i < n;i++) {
                    ans.add(new StringBuilder(ans.get(i)));
                    ans.get(i).append(Character.toUpperCase(ch));
                    ans.get(n+i).append(Character.toLowerCase(ch));
                }

            } else {
                for(int i = 0;i < n;i++) {
                    ans.get(i).append(ch);
                }
            }
        }
        List<String> finalAns = new ArrayList<>();
        for(StringBuilder sb : ans) {
            finalAns.add(sb.toString());
        }
        return finalAns;
    }
}

到了这里,关于每日刷题记录(十七)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

    对于每个项目或产品来说,发布版本的创建都需要一定的时间,其具体过程因各公司或组织的情况而异。 Git 无法用来指定项目进入发布阶段的时间。但我们可以利用标签和分支这两个强大的Git 工具来为发布进度设置一个很宽泛的时间区间。 在本章的工作流中,我们将以一个

    2024年04月28日
    浏览(44)
  • 【力扣刷题 | 第十七天】

    目录 前言: 55. 跳跃游戏 - 力扣(LeetCode) 45. 跳跃游戏 II - 力扣(LeetCode) 总结:         今天两道类型都是贪心算法,希望可以有所收获 给定一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断

    2024年02月15日
    浏览(42)
  • 【算法笔记】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

    求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等及条件判断语句(A?B:C)、位运算、递归、公式、sizeof。 习题链接:题目链接 该题把我们的所有能用的方法都给限制死了,我们只能用一些的特殊的方法来做。不知道大家在思考的过程中考没考虑过

    2024年02月07日
    浏览(59)
  • 每日一题 第五十七期 洛谷 统计子矩阵

    给定一个 N × M N times M N × M 的矩阵 A A A ,请你统计有多少个子矩阵 (最小 1 × 1 1 times 1 1 × 1 , 最大 N × M ) N times M) N × M ) 满足子矩阵中所有数的和不超过给定的整数 K K K 。 第一行包含三个整数 N , M N, M N , M 和 K K K 。 之后 N N N 行每行包含 M M M 个整数, 代表矩阵 A A A 。 一

    2024年04月23日
    浏览(36)
  • 使用微软提供的工具获取权限删除不能直接删除的注册表(删除U盘等移动设备记录)

    在计算机HKEY_LOCAL_MACHINESYSTEMControlSet001EnumUSBSTOR中保存了电脑连接过的移动设备信息,但是直接右键无法删除项目 在网上搜索资料后发现微软有发布工具可以进行删除操作,但是需要输入命令,于是,我使用C#进行简单的封装 该代码执行后,使用psexec.exe打开注册表并可以删

    2024年02月16日
    浏览(37)
  • 每日刷题_

    347. 前 K 个高频元素 给你一个整数数组  nums  和一个整数  k  ,请你返回其中出现频率前  k  高的元素。你可以按  任意顺序  返回答案。 一共有三种不同的题解: 1、把数据存到哈希表中,然后通过哈希表来排序,时间复杂度n*logn 2、大根堆 k*logn 3、小根堆 k*logn 这里的

    2024年02月06日
    浏览(35)
  • 每日刷题-5

    目录 一、选择题 二、算法题 1、不要二 2、把字符串转换成整数 1、 解析:printf(格式化串,参数1,参数2,.….),格式化串: printf第一个参数之后的参数要按照什么格式打印,比如 %d---按照整形方式打印,不过格式串有一定规定, %之后跟上特定的字符才代表一定的格式化 。

    2024年02月09日
    浏览(42)
  • 【每日刷题】Day12

    1. 67. 二进制求和 - 力扣(LeetCode) //思路:将两个字符串的内容先逆置,然后分别从头开始遍历,如果当前位置两个字符串内容都为1,则说明要进位,使用carry变量来判断是否进位,动态开辟一块内存ans用于存放求和后每个位置的值 void reserve(char* s) //逆置函数 {     int len

    2024年04月13日
    浏览(24)
  • 每日刷题-2

    目录 一、选择题 二、编程题 1、倒置字符串 2、排序子序列 3、字符串中找出连续最长的数字串 4、数组中出现次数超过一半的数字 1、 题目解析: 二维数组初始化的一般形式是: 数据类型 数组名[常量表达式1][常量表达式2] = {初始化数据}; 其中,常量表达式1和常量表达式

    2024年02月09日
    浏览(37)
  • 每日刷题|贪心算法初识

                                            食用指南:本文为作者刷题中认为有必要记录的题目                                         推荐专栏 : 每日刷题                                        ♈️ 今日夜电波 : 悬溺—葛东琪                        

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包