剑指offer 66题 part6(31~36题)

2024-02-13 16:38
文章标签 36 31 offer 66 part6

本文主要是介绍剑指offer 66题 part6(31~36题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第三十一题:求1~n中所有整数里面1出现次数和

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数

class Solution {
/*
本题解法我们可以用两个数字来模拟即可懂
43147
43247
对于百位来说,是不同的,在下列程序运行的结果也不一样
因为我们找规律可以发现,百位出现1的次数,由前后两部分影响
并且如果它还是1的话,后面一部分影响的值有变换
+8的意思是:如果当前位大于1使得其进一位,方便计算
*/
public:int NumberOf1Between1AndN_Solution(int n){int a,b,cnt=0;for(int m=1;m<=n;m*=10){a=n/m;b=n%m;cnt+=(a+8)/10*m+(a%10==1?1:0)*(b+1);}return cnt;}
};

第三十二题:把数组排成最小的数

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323

/*
sort中的比较函数compare要声明为静态成员函数或全局函数
因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的
静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。
同时静态成员函数不可以调用类的非静态成员
*/
class Solution {
private:static bool cmp(int a,int b){string A=to_string(a)+to_string(b);string B=to_string(b)+to_string(a);return A<B;}
public:string PrintMinNumber(vector<int> numbers) {string ans="";sort(numbers.begin(),numbers.end(),cmp);for(int i=0;i<numbers.size();i++)ans+=to_string(numbers[i]);return ans;}
};

第三十三题:丑数

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数

题解:

设定三个指针,分别从同一个位置开始,当指针指向的下一个数字是最小的时候,对应的指针指向移动一个

class Solution {
public:int GetUglyNumber_Solution(int index) {if(index==0) return 0;vector<int>ans(index);int t2=0,t3=0,t5=0;ans[0]=1;for(int i=1;i<index;i++){ans[i]=min(2*ans[t2],min(3*ans[t3],5*ans[t5]));if(ans[i]==ans[t2]*2) t2++;if(ans[i]==ans[t3]*3) t3++;if(ans[i]==ans[t5]*5) t5++;}return ans[index-1];}
};

第三十四题:第一个只出现一次的字符

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

题解:

hash,map(红黑树)等等

class Solution {
public:int FirstNotRepeatingChar(string str) {map<char,int>mp;for(int i=0;i<str.size();i++)mp[str[i]]++;for(int i=0;i<str.size();i++)if(mp[str[i]]==1) return i;return -1;}
};

第三十五题:数组的逆序数对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

数据范围有点大,不能暴力

搞过acm的都知道可以用,线段树,树状数组,归并思想

下面代码使用归并思想:

递归到叶子节点后再返回上一级合并,这里使用一个辅助数组,但是利用了辅助数组却没有把辅助数组的内容复制回去到原数组,见代码注释即可理解

递归到叶子节点很简单,合并的时候见下图


class Solution {
private:long long deal(vector<int> &data,vector<int> &cp,int start,int end){if(start==end){cp[start]=data[start];return 0;}int len=(end-start)/2;long long left=deal(cp,data,start,start+len);//这里直接交换了数组,就不需要再把辅助数组复制回去long long right=deal(cp,data,start+len+1,end);int i=start+len,j=end;int index=end;long long cnt=0;while(i>=start&&j>=start+len+1){if(data[i]>data[j]){cp[index--]=data[i--];cnt+=j-start-len;}else cp[index--]=data[j--];}while(i>=start) cp[index--]=data[i--];while(j>=start+len+1) cp[index--]=data[j--];return (left+right+cnt)%1000000007;}
public:int InversePairs(vector<int> data) {int size=data.size();if(size<=0) return 0;vector<int> cp=data; //这里已经保证了两个数组一致long long cnt=deal(data,cp,0,size-1);return cnt%1000000007;}
};


第三十六题:两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共结点

题解:根据结构体可以发现,一旦有公共节点,那么两个链表的尾部就一定是相同的

所以,我们先跑一边得到链表的长度,然后再把最长的先跑相应节点使得两条链表尾部长度一样,最后再一起跑,如果相同肯定会一起到达尾部,在此过程中就可以碰到第一个相同的节点返回即可

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {int a=0,b=0,t;ListNode *p1=pHead1,*p2=pHead2;while(p1) p1=p1->next,a++;while(p2) p2=p2->next,b++;if(a>b){t=a-b;while(t--) pHead1=pHead1->next;t=b;}else if(b>a){t=b-a;while(t--) pHead2=pHead2->next;t=a;}else t=a;while(t&&(pHead1->val)!=(pHead2->val)){pHead1=pHead1->next;pHead2=pHead2->next;t--;}return pHead1;}
};


这篇关于剑指offer 66题 part6(31~36题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706050

相关文章

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

关于大模型和AIGC的36条笔记和真话

行业到底有多卷? 最新统计,中国已有130多个大模型问世,在网信办备案的算法模型也超过70多家。BAT等互联网巨头悉数下场发布AI大模型,仅2023年就有超60家创业公司拿到融资,产品更是布满了基础层、模型层和应用层。新一代生成式AI,可能要回头看看上一代AI趟过的坑,不要行业自嗨,避免上一个冬天的轮回。在这个领域的从业者,更要清晰地看到行业的内卷和客户的痛点,别被大佬的鸡汤迷了眼。 1、

20190315 把整理和培养自己当作一生的事业,而不是局限在找工作拿offer。

把整理和培养自己当作一生的事业,而不是局限在找工作拿offer,做有本事的人。 来东南读研半年了,明显感觉自己掌握的不过是书本知识级别的中上水平,垃圾收集器这些的只知道背面经,靠脑子硬记,缺乏整理和系统,一头浆糊。 现在一边做实训这个烂项目,一边刷面经,一边刷剑指offer,想投些大公司的实习,又觉得还没准备好,看着各 种面经,都能说个大概,但明显感觉到自己知识的不体系和不深入,**做的项目

leetcode#66. Plus One

题目 Given a non-negative integer represented as a non-empty array of digits, plus one to the integer. You may assume the integer do not contain any leading zero, except the number 0 itself. The digi

itoa()函数,10进制转换到(2~36)进制

先看下itoa()的函数说明吧: 功 能:把一整数转换为字符串   用 法:char *itoa(int value, char *string, int radix);    详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写.    参数:  value: 待转化的整数。            radix:

尝试用java spring boot+VUE3实现前后端分离部署(8/31)

前言         这几天开学了,公司这边几个和学校对接的项目都挺忙的,然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目,大佬让我自己去学了。在看若依的项目的时候在想,python的FLASK后端实现和JAVA spring boot的实现差别大不大,两者实现的思路估计大差不差,那具体的代码逻辑和代码实现又有多大差别,java面向对象的编程思想又是怎么体现的。这些想法迫使我将原来使用

代码随想录Day 36|滑铁卢了,leetcode题目:1049.最后一块石头的重量、494.目标和、474.一和零

提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划一、题目题目一:1049.最后一块石头的重量II解题思路: 题目二:494.目标和动态规划 (二维dp数组)#动态规划 (一维dp数组) 题目三: 474.一和零解题思路: 总结 动态规划 有点难了,之前差的有点多,找时间补 一、题目 题目一:1049.最后一块石头的重量II leetcode题目链接

[C/C++入门][进制原理]31、求分数序列和

题目来自于信息学奥赛 1078 分析: 这道题看起来比较复杂,实际上只需要通过两个公式,一次性求出分母和分子,然后把这个求出来的数加入到变量和中。甚至都不需要知道总共游哪些数。数组都用不上。循环就能解决。 #include <iostream>#include <iomanip> // 用于格式化输出using namespace std;int main() {double s

代码随想录冲冲冲 Day38 动态规划Part6

322. 零钱兑换 最大最小值的问题 这样的问题不需要考虑遍历顺序 但是这道题需要注意的是红线的两个部分 这两个部分的意思是一样的 首先dp[j]代表的是amount为j的时候 最小的硬币数量 如果说任何的dp[j]为INT_MAX也就是初始值,这就说明这哥mount的数量没有得到或者得不到 那么就不能继续更新了加入j =5 有可能 j=4根本得不到 那么由dp[4] +1就不合理了

“弹性盒子”一维布局系统(补充)——WEB开发系列31

弹性盒子是一种一维布局方法,用于根据行或列排列元素。元素可以扩展以填补多余的空间,或者缩小以适应较小的空间,为容器中的子元素提供灵活的且一致的布局方式。 一、什么是弹性盒子? CSS 弹性盒子(Flexible Box Layout,简称 Flexbox)是 CSS3 中引入的一种布局模式,提供一种有效的方式来布局、对齐和分配容器内空间,特别是在动态和复杂的应用界面中。 1、