剑指offer(31-35)编程题
31.求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
string str = std::to_string(n);
int len = str.length();
int first = str[] - '';
if (len == && first == ) return ;
if (len == && first > ) return ;;
//最高为1
int num1 = ;
if (first > ) {
num1 = pow(, len - );
} else if(first == ){
num1 = stoi(str.substr()) + ;
}
int num2 = first * (len - ) * pow(, len - );
return num1 + num2 + NumberOf1Between1AndN_Solution(stoi(str.substr()));
}
};
32.输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
class Solution {
public:
static bool comp(const string& a, const string& b) {
string ab = a + b;
string ba = b + a;
if(ab > ba) return false;
return true;
}
public:
string PrintMinNumber(vector<int>& numbers) {
vector<string> numStrs;
for(size_t i=;i<numbers.size();i++){
numStrs.push_back(to_string(numbers[i]));
}
sort(numStrs.begin(),numStrs.end(),comp);
string res;
for(int i=;i<numStrs.size();i++){
res += numStrs[i];
}
return res;
}
};
33把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
class Solution {
public:
int GetUglyNumber_Solution(int index) {
vector<int> uglyArray = { , , , , };
if (index <= )
return uglyArray[index - ];
int m2, m3, m5;
int n1 = ,n3 = ,n5 = ;
int k = ;
while (k <= index) {
for (int i = n1; i < uglyArray.size(); i++) {
if ( * uglyArray[i] > uglyArray.back()) {
m2 = * uglyArray[i];
n1 = i;
break;
}
}
for (int i = n3; i < uglyArray.size(); i++) {
if ( * uglyArray[i] > uglyArray.back()) {
m3 = * uglyArray[i];
n3 = i;
break;
}
}
for (int i = n5; i < uglyArray.size(); i++) {
if ( * uglyArray[i] > uglyArray.back()) {
m5 = * uglyArray[i];
n3 = i;
break;
}
}
uglyArray.push_back(min(min(m2,m3),m5));
k++;
}
return uglyArray.back();
}
};
34.在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。如果字符串为空,返回-1
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int tableSize = ;
int *hashTable = new int[tableSize];
for (int i = ; i < ; i++) {
hashTable[i] = ;
}
for (size_t i = ; i < str.size(); i++) {
hashTable[static_cast<unsigned int>(str[i])]++;
}
for (size_t i = ; i < str.size(); i++) {
if (hashTable[static_cast<unsigned int>(str[i])] == )
return i;
}
delete[] hashTable;
return -;
}
};
35.在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
class Solution {
private:
int InversePairs(vector<int>&data, int left, int right) {
if (left == right) return ;
int mid = left + (right - left) / ;
int leftCount = InversePairs(data, left, mid);
int rightCount = InversePairs(data, mid + , right);
int mergeCount = merge(data, left, mid, right);
return (leftCount + rightCount + mergeCount)%;
}
int merge(vector<int>& data, int left, int mid, int right) {
int* temp = new int[right - left + ];
int p = mid;
int q = right;
int count = ;
int k = right - left;
while (p >= left && q > mid) {
if (data[p] > data[q]) {
count = (count + q - mid)%;
temp[k--] = data[p--];
} else {
temp[k--] = data[q--];
}
}
while (p >= left) {
temp[k--] = data[p--];
}
while (q > mid) {
temp[k--] = data[q--];
}
for (int i = ; i <= right - left; i++) {
data[left + i] = temp[i];
}
delete[] temp;
return count;
}
public:
int InversePairs(vector<int> data) {
int n = data.size();
if (n < )
return -;
return InversePairs(data, , n - );
}
};
剑指offer(31-35)编程题的更多相关文章
- 剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某 ...
- 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题
剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...
- 剑指offer 面试35题
面试35题: 题目:复杂链表的复制 题:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中 ...
- 剑指offer(35)数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 【Java】 剑指offer(31) 栈的压入、弹出序列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否 ...
- 【剑指Offer】俯视50题之31 - 40题
面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面试题36数组中的逆序对 面试题37两个链表的第一 ...
- 每日一题 - 剑指 Offer 31. 栈的压入、弹出序列
题目信息 时间: 2019-06-25 题目链接:Leetcode tag:栈 难易程度:中等 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入 ...
- [持久更新] 剑指offer题目Python做题记录
第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...
- 《剑指offer》第十三题(机器人的运动范围)
// 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...
- 【剑指Offer】俯视50题之21 - 30题
面试题21包括min函数的栈 面试题22栈的压入.弹出序列 面试题23从上往下打印二叉树 面试题24二叉搜索树的后序遍历序列 面试题25二叉树中和为某一值的路径 面试题26复杂链表的复制 ...
随机推荐
- 自定义Team Foundation Server (TFS) 与Project Professional的集成字段
用户可以象使用Office Excel一样,使用Project Professional连接TFS,将数据下载到本地修改,并且发布到TFS服务器上,如果你习惯使用Project来计划你的项目,那么Pr ...
- driver.get()和driver.navigate().to()到底有什么不同?-----Selenium快速入门(四)
大家都知道,这两个方法都是跳转到指定的url地址,那么这两个方法有什么不同呢?遇到这种情况,第一反应就是查查官方的文档. 官方文档的说法是:Load a new web page in the cur ...
- Windows服务器管理与优化
一.服务器自动重启windows服务器运行时间长了,内存会爆满,比如数据库会缓存大量的数量,IIS进程也会缓存数据而没有及时释放.这样需要定时重启服务器来释放内存. 创建任务计划,如在 每周一/周三/ ...
- SQL Server数据库的基础脚本编程
数据库脚本的基础编程 Go批量处理语句 用于同时处理多条语句 use指定数据库或表 use master --创建数据库 go use Student --创建表(Student)表示数据库 go 创 ...
- SQL查询速度慢的原因分析和解决方案
SQL查询速度慢的原因分析和解决方案 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建 ...
- MaxScript通过.net发送邮件
Fn SmtpSendMail argSmtpAddress argSenderAddress argSenderPassword argTargetAddress argTitle argMessa ...
- LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)
题面 传送门 题解 转化为\(dfs\)序之后就变成一个区间加,区间查询\(k\)小值的问题了,这显然只能分块了 然而我们分块之后需要在块内排序,然后二分\(k\)小值并在块内二分小于它的元素--一个 ...
- Linux中tail指令详解
linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...
- 干货 | Elasticsearch Nested类型深入详解(转)
https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...
- 逻辑卷磁盘管理和dd命令
底层PV 中层VG 上层LV PE(phsical extent):在逻辑层次上,VG把PV分成固定大小的块,这些块就叫PE,默认为4M ,创建LV的过程就是分多少个PE的过程. 自动分区的过 ...