【迎战蓝桥】 算法·每日一题(详解+多解)-- day5

这篇具有很好参考价值的文章主要介绍了【迎战蓝桥】 算法·每日一题(详解+多解)-- day5。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🤞目录🤞

💖1. 数组中出现次数超过一半的数字

💖2. 二进制中1的个数

💖3. 替换空格


【大家好,我是爱干饭的猿,如果喜欢这篇文章,点个赞👍,关注一下吧,后续会一直分享题目与算法思路


📘1. 数组中出现次数超过一半的数字

描述

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n ≤ 50000,数组中元素的值 100000 ≤ val ≤ 10000

要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)

【迎战蓝桥】 算法·每日一题(详解+多解)-- day5

解题思路:

🎈1. 方法一:我们可以使用map,根据map的键值对,将数组元素存入map中,相同key值的value值+1,当当前key的value值大于数组元素一半时,return key即可。

🎈2. 方法二:我们发现如果存在一个数字出现的次数超过数组长度的一半,当此数组排序后,出现次数最多的数字,一定在中间位置

🎈3. 方法三:查询的本质是排除,所以我们可以先定义一个target 指向数组第一个元素,times 指出现次数,然后向后遍历,当后一个元素与target 相同时,times++;当后一个元素与target 不相同时,times --;当times == 0时,将当前元素赋值给 target。循坏结束 target 值就是出现次数最多的数字,然后遍历数组得到target出现的次数,如果大于数组元素一半时,return target 即可。

💡方法一:代码如下: 

    // 方法一 利用map 键值对
    public int MoreThanHalfNum_Solution1(int [] array) {
        if(array.length == 0 || array ==null){
            return 0;
        }
        int half = array.length >> 1;

        Map<Integer,Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < array.length; i++) {
            if(map.containsKey(array[i])){
                // map中存在当前key 时,value + 1
                map.replace(array[i],map.get(array[i])+1);
            }else {
                // map中不存在当前key 时,存入key,并将value 置为1
                map.put(array[i],1);
            }

            if(map.get(array[i]) > half){
                // 当前key的value值大于数组元素一半时,key就是所求值
                return array[i];
            }
        }
        return 0;
    }

💡方法二:代码如下: 

    // 方法二 数组排序
    public int MoreThanHalfNum_Solution2(int [] array) {
        if(array.length == 0 || array == null){
            return 0;
        }
        int half = array.length >> 1;
        Arrays.sort(array);
        int target = array[half];
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if(target == array[i]){
                count++;
            }
        }
        return count > half ? target : 0;
    }
// 如果确定存在一个数字出现的次数超过数组长度的一半,return array[array.length/2]即可
 public int MoreThanHalfNum_Solution(int [] array) {
        if(array.length == 0 || array == null){
            return 0;
        }
        return array[array.length/2];
    }

💡方法三:代码如下: 

    // 方法三 查询的本质是排除
    public int MoreThanHalfNum_Solution3(int [] array) {
        if(array.length == 0 || array == null){
            return 0;
        }
        int half = array.length >> 1;

        int target = array[0];
        int times = 1;
        for (int i = 1; i < array.length; i++) {
            if(times == 0){
                // 当times == 0时,将当前元素赋值给 target
                target = array[i];
                times = 1;
            }else if(target == array[i]){
                // 当后一个元素与target 相同时,times++
                times++;
            }else {
                // 当后一个元素与target 不相同时,times--
                times--;
            }
        }

        times = 0;
        for (int i = 0; i < array.length; i++) {
            if(target == array[i]){
                times ++;
            }
        }
        return times > half ? target : 0;
    }

📘2. 二进制中1的个数

描述

输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

【迎战蓝桥】 算法·每日一题(详解+多解)-- day5

解题思路:

🎈1. 方法一:我们知道只有1&1 = 1,其余0&0 = 0,1&0 = 0,0&1 = 0。

所以我们可以将整数的二进制每一位按位&1操作,然后整数右移一位,继续&1,统计得数为1的次数,但是我们发现,当整数为负数时,会出现死循环,因为负数右移时,在最高位补得是1;

因此,我们可以将整数的二进制每一位按位&1操作,然后将1左移一位,&操作后值不为0,count++。

🎈2. 方法二:我们可以循坏进行n&(n-1)操作,当n&(n-1) = 0 时,退出循环。因为我们发现,每进行一次n&(n-1)操作,该二进制数排除了一个1,所以我们可以不停的n & (n-1),直到n == 0000 0000,排除结束。

【迎战蓝桥】 算法·每日一题(详解+多解)-- day5

💡方法一:代码如下: 

    // 错解
    // 从n的2进制形式的最右边开始判断是不是1
    // 可能陷入死循环的解法
    // 因为负数右移时,在最高位补得是1
    public static int NumberOf1_1(int n) {
        int count = 0;
        while (n != 0){
            if((n & 1) == 1){
                count ++;
            }
            // 把n的2进制形式往右推一位
            n = n >> 1;
        }
        return count;
    }

    // 方法一:
    // 和错解类似,只是我们现在将1左移一位
    public static int NumberOf1_2(int n) {
        int count = 0;
        int flag = 1;
        while (flag != 0){
            if((n & flag) != 0){
                count ++;
            }
            flag = flag << 1;
        }
        return count;
    }

💡方法二:代码如下:  

    // 方法二:
    // 例:    1000 1010   (n)
    //        1000 1001   (n-1)
    //   &之后 1000 1000   排除了一个1
    // 所以我们可以不停的n & (n-1),直到n == 0000 0000,排除结束
    public static int NumberOf1_3(int n) {
        int count = 0;
        while (n != 0){
            n = n & (n - 1);
            count++;
        }
        return count;
    }

📘3. 替换空格

描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:

🎈1. 方法一:我们可以设置一个空字符串ret,然后遍历题中字符串,当遇到字符为空时ret+="20%",其余ret += s.charAt(i),得到新字符串ret ,return ret 即可。

🎈2. 方法二:我们也可以先统计空字符的个数,然后设置新字符串长度,然后从后往前遍历题中字符串,当遇到字符为空时,分别倒置插入字符'0' '2' '%',其余字符倒置插入即可

💡方法一:代码如下:  

    // 方法一:
    public static String replaceSpace1(StringBuffer str) {
        String s = str.toString();
        String ret = "";
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == ' '){
                ret +="%20";
            }else {
                ret += c;
            }
        }
        return ret;
    }

💡方法二:代码如下:  文章来源地址https://www.toymoban.com/news/detail-400805.html

    // 方法二:
    public static String replaceSpace(StringBuffer str) {
        // 找出空格数
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i) == ' '){
                count++;
            }
        }

        int old_end = str.length() - 1;
        // 设置新字符串长度
        str.setLength(str.length() + count*2);
        int new_end = str.length() - 1;

        while (old_end >= 0 && new_end >= 0){
            // 填数
            if(str.charAt(old_end) == ' '){
                str.setCharAt(new_end--, '0');
                str.setCharAt(new_end--, '2');
                str.setCharAt(new_end--, '%');
                old_end--;
            }else {
                // 不为空 则平移
                str.setCharAt(new_end--,str.charAt(old_end));
                old_end--;
            }
        }
        return str.toString();
    }

到了这里,关于【迎战蓝桥】 算法·每日一题(详解+多解)-- day5的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 蓝桥杯备赛 | 洛谷做题打卡day5

    题目描述 小 K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小 K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。 假设洛谷

    2024年01月17日
    浏览(59)
  • C语言:选择+编程(每日一练Day5)

    目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:数字在升序数组中出现的次数 思路一: 思路二: 题二:整数转换  思路一: 本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵! 感谢大佬们的一键

    2024年02月09日
    浏览(50)
  • 蓝桥杯每日一题----货物摆放

    上来一看,三个for循环,从1到n,寻找满足l w h=n的个数,但是这样根本跑不出来答案,n太大了,1e15的级别,O(n)的时间复杂度都不行,更何况是O(n^3)。 尝试降低时间复杂度很难,可以尝试降低数据规模。 插入理论:影响代码运行时间的两个因素算法时间复杂度和数据规

    2024年01月21日
    浏览(42)
  • (蓝桥杯每日一题)love

    问题描述 马上就要到七夕情人节了,小蓝在这天想要心爱得男神表白,于是她写下了一个长度为n仅由小写字母组成的字符串。 她想要使这个字符串有 1314个 love 子序列但是马虎的小蓝却忘记了当前已经有多少个子序列为 love。 请你帮小蓝计算出当前字符串有多少个子序列为

    2024年01月21日
    浏览(46)
  • (蓝桥杯每日一题)字符串排序

    本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝要把一个字符串中的字母按其在字母表中的顺序排列 例如,LANQIAO 排列后为AAILNOQ 又如, GOODGOODSTUDYDAYDAYUP 排后为AADDDDDGGOOOOPSTUUYYY 请问对于以下字符串,排列之后字符串是什么? WHERETHEREISA

    2024年01月21日
    浏览(41)
  • 【C语言蓝桥杯每日一题】——排列字母

    TOC     😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话

    2023年04月09日
    浏览(47)
  • 蓝桥杯每日一题----单调栈和单调队列

    单调栈即栈内的元素是单调递减或者单调递增的,我们通过一个题目来理解。 单调栈模板题 题目描述 给出项数为 n 的整数数列 a 1 … a n a_1…a_n a 1 ​ … a n ​ 。 定义函数 f ( i ) f(i) f ( i ) 代表数列中第 i 个元素之后第一个大于 a i a_i a i ​ 的元素的下标,即 f ( i ) = m i n i

    2024年02月19日
    浏览(43)
  • 【C语言蓝桥杯每日一题】——等差数列

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2023年04月09日
    浏览(80)
  • 【蓝桥杯集训·每日一题】AcWing 3305. 作物杂交

    3305. 作物杂交 作物杂交是作物栽培中重要的一步。 已知有 N 种作物 (编号 1 至 N),第 i 种作物从播种到成熟的时间为 Ti。 作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。 如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天,则 AB 杂交花费的时间为 7 天。 作

    2023年04月13日
    浏览(56)
  • 蓝桥杯每日一题002 不同子串(set用法)

    【问题描述】     一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。例如,字符串 aaab 有非空子串 a,b,aa,ab,aaa,aab,aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串 0100110001010001 有多少个不同的非空子串?     

    2024年01月21日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包