《剑指offer》系列第二弹,让我们用饱满的热情,迎接接下来的几道小题。 >本系列分享的都是常规做法和全新思路的总结,各位可千万不要看着眼熟,而错过新颖的思路噻!!!

文章目录

  • 1.将数组中出现次数超过一半的数字返回
    • (1)采用unordered_map方式
    • (2)先排序再找中间位置元素记录次数进行验证
    • (3)候选法,两个不同的数据相消减
  • 2. 将字符串中的空格替换成 %20
  • 3.递归的思路实现单链表的逆序打印
  • 4. 大郎,喝鸡汤了!!!

1.将数组中出现次数超过一半的数字返回

(1)采用unordered_map方式

这应该是在我们学习了C++等相关知识后,最方便的一种做法。

代码和注释代表思路如下: 先找到keyi值,如果是首次出现就设置次数为1,不是第一次就++次数

#include<unordered_map>
int MoreThanHalfNum_Solution(vector<int > numbers)
{int half=numbers.size()/2;//先拿到一半的个数是多少unordered_map<int,int> map;//采用<数字,次数>的映射关系,最后统计出现的次数//想要统计个数就涉及到遍历for(int i=0;i<numbers.size();++i){auto it=map.find(numbers[i]);//找到keyi值if(it==map.end())//如果没有找到,就首次进行插入{//在i的位置,次数加为1,表示第一次出现map.insert({numbers[i],1});}else//如果不是第一次出现,次数就++{map[numbers[i]]++;}if(map[numbers[i]]>half)return numbers[i];}return 0;
}

(2)先排序再找中间位置元素记录次数进行验证

这个方式的思路就是:

如果他的次数大于一半,那么在进行排序之后中间元素就一定是内个次数大于一半的,
然后再遍历一遍验证这个元素的个数是否大于一半。

int MoreThanHalfNum_Solution(vector<int > numbers)
{sort(numbers.begin(),numbers.end());int target=numbers[numbers.size()/2];int count=0;for(int i=0;i<numbers.size();++i){if(target==numbers[i])count++;}if(count>numbers.size()/2)return target;return 0;
}

(3)候选法,两个不同的数据相消减

思路:既然出现次数大于一半,如果两个元素不相同,
那么我选择一换一的方式对于数组进行抵消,剩下的内个就是最多的内个。
具体实现:cond:就是值,cnt就是次数,通过对于众数次数的–,实现相消的效果。
遇到不同的就减减。

int MoreThanHalfNum_Solution2(vector<int> numbers){int cond = -1;int cnt = 0;for (int i = 0; i < numbers.size(); ++i){if (cnt == 0)//这个cnt就是此时众数和非众数继续相消所剩下的个数。//如果消减只剩下0,就说明前面的区间消除完毕,继续消减后面的//反正众数就是比非众数多{cond = numbers[i];++cnt;}else//相同就++,不同就--,基础就是众数的存在,在两两相消的进程中,总会剩下一个。{if (cond == numbers[i])++cnt;else--cnt;}}//得到cond数字,然后进行数出现的次数cnt = 0;for (const int k : numbers){if (cond == k)++cnt;}if (cnt > numbers.size() / 2)return cond;return 0;}

2. 将字符串中的空格替换成 %20

一个空格是一个字符,替换成的这个是三个字符。(因题而异),那么我们想的就是当遇到空格的时候就进行替换,就涉及到扩容的问题,扩几个的问题。

指针示意图如下:

void replaceSpace(char* str,int length)
{int count=0;char* start=str;//记录,空格的次数,便于扩充之后新的尾指针的确定while(*start){if(isspace(*start))//如果是空格,就记录空格的次数{count++;}start++;}char *old_end =str+length;char* new_end=str+length+2*count;while(old_end>=str&&new_end>=str){if(isspace(*old_end)){*new_end=*old_end;//将不是空格的字符向后移动,以便给插入字符留出空间new_end--,old_end--;}else{//先赋值,再往前移动位置*new_end--='0';*new_end--='2';*new_end--='%';old_end--;}}
}

3.递归的思路实现单链表的逆序打印

递归的方式实现 递归返回的时候实现打印或者内容的保存
不理解的bro 可以画个图理解一下

void Fprint(ListNode listnode, ArrayList<Integer>list)
{if(listNode==NULL)return ;Fprint(listnode .next,list);list.add(listnode.val);
}
ArrayList<Integer>print(ListNode listnode)
{ArrayList<Integer> list=new ArrayList<>();Fprint(listnode,list);return list;
}

手绘图如下:

4. 大郎,喝鸡汤了!!!

人生的精彩,就在于接下来的每一个场景都有他的未知性。或许在某一个瞬间,或许某一个场景,遇到的某一个人发生的某一个事都会给你心灵上的安慰。如春风般沐浴,如夏雨般滋润我们的心田。
让我们热爱生活,认真走好每一步。诗意般的远方就会越来越近。

Fighting!my bro!

《剑指offer》每日分享三道题- 2 day相关推荐

  1. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  2. 算法题001 剑指Offer 面试题三:二维数组中的查找

    剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...

  3. 剑指offer每日六题---------day five

    剑指offer题25:复制一个随机链表 RondomListNode* RandomLinkCopy(RondomListNode *head) {if (!head)return NULL;//头结 ...

  4. 牛客网(剑指offer) 第三题 输入一个链表,从尾到头打印链表每个节点的值。

    //输入一个链表,从尾到头打印链表每个节点的值. //解题思路:遍历每一个节点  并将节点放入数组中 最后翻转数组 function printListFromTailToHead($head) {$ ...

  5. 《剑指offer》第三十一题(栈的压入、弹出序列)

    // 面试题31:栈的压入.弹出序列 // 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是 // 否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4. / ...

  6. 《剑指offer》第三十五题(复杂链表的复制)

    // 面试题35:复杂链表的复制 // 题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复 // 制一个复杂链表.在复杂链表中,每个结点除 ...

  7. 剑指offer笔记(三)菜鸟程序猿和高级攻城狮码赋值运算符函数的区别

    赋值运算符函数 小小的一个赋值运算符函数的写法完全可以区分出一个程序猿的功底 运算符函数是C++中经典的运算符重载函数 对于给定一个类: class my_string { public:my_str ...

  8. 剑指 Offer 06. 从尾到头打印链表(python3编写)

    目录 1.题目描述: 2.方法一:使用栈保存结果 思路: 代码(迭代法): 代码(递归法): 3.方法二:反转链表 思路: 代码: 4.方法三:保存数组,再反转数组 思路: 代码: 5.总结: 1.题 ...

  9. 剑指 Offer 52. 两个链表的第一个公共节点

    题目:剑指 Offer 52. 两个链表的第一个公共节点 ,哈哈,我们今天来看一道很简单的题嘛,这是选自剑指 Offer 上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不 ...

最新文章

  1. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)
  2. vault-使用kubernetes作为认证后端
  3. python for循环删除
  4. python画旺仔代码_美术生把旺仔牛奶画成抖音网红,看清画的是谁,网友:确认过眼神...
  5. sqlsourcesafe mysql_mysql权限问题,看不到其它的库!
  6. nidlist 问题
  7. Maven+SpringMVC+Dubbo+zookeeper 简单的入门demo配置
  8. charles 过滤指定域名
  9. 计算机跨考医学检验技术,医学检验技术考研可以考哪些专业?
  10. Python测试开发django2.环境部署项目创建
  11. golang执行多个linux命令,golang执行系统command
  12. cefsharp 网页另存为图片_如何一键导出所有图片?我另存为了两小时,结果同事十秒就搞定了...
  13. TensorFlow DCNN
  14. Java 集合源码分析
  15. 【MATLAB】基本绘图函数(涵盖所有基本绘图指令)
  16. 三年经验前端vue面试记录
  17. 往前走吧,管它未来是什么!!
  18. NX二次开发-UFUN创建圆柱UF_MODL_create_cyl1
  19. HDU 新生赛 油菜花王国(并查集)
  20. 停车场寻车是怎么实现的?车库寻车有什么好办法?

热门文章

  1. 北大生命学院邓宏魁课题组最新成果:建立全新胰岛移植策略,解决干细胞治疗糖尿病的关键难题...
  2. 分享一些优秀的思维导图作品
  3. ping包 命令格式 用法集
  4. 灰度(金丝雀)发布、蓝绿部署、滚动发布
  5. JPA Unknown Id.generator: xxx
  6. 蚂蚁金服在 Service Mesh 监控落地经验分享
  7. dpo指标详解买入绝技_雷霆一击战法买入及卖出方法的相关介绍
  8. 算法思想简介(分制(分开在递归),贪心(DJS),动态分配(dp,解决多变化条件),回溯(万能,深度优先))
  9. 计算机考试可以重复考吗,计算机二级能重复考吗
  10. 【安卓】腾讯Bugly之应用升级热更新-热更新