剑指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复杂链表的复制 ...
随机推荐
- Lucene索引的【增、删、改、查】
前言 搞检索的,应该多少都会了解Lucene一些,它开源而且简单上手,官方API足够编写些小DEMO.并且根据倒排索引,实现快速检索.本文就简单的实现增量添加索引,删除索引,通过关键字查询,以及更新索 ...
- Visual Studio 2017(VS2017) 企业版 Enterprise 注册码
Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 终于等到你,最强 IDE Visual Stud ...
- 10-12Linux流编程的一些知识点
第五章 Linux 的流编程 Linux流操作基础 流和文件的关系:流相当于一个缓冲区,可以将文件描述符和流关联,获得相应的缓冲区,以此来提高系统对磁盘的存取速度. 流的结构和操作 ...
- cesium随笔 — 简单实现获取三维范围(包括相机高度)
代码 // 获取当前三维范围 function getCurrentExtent() { // 范围对象 var extent = {}; // 得到当前三维场景 var scene = viewer ...
- Skyline桌面二次开发之路径漫游(C#)
所谓路径漫游:即创建一个动态对象和一条由多点组成的线,然后让动态对象沿着线飞行 首先绘制一条线,实际上路径漫游是不需要绘制线的,我这里只是为了确认动态对象是否沿着线路在飞行,代码如下: //绘制路径 ...
- pageadmin CMS 如何添加自定义页面
理论上网站上的所有页面都可以通过栏目管理来添加,那自定义页面的意义是什么呢? 网站的需求是很多样化的,比如需要制作一个对外提供数据的api,甚至制作一个搜索页面,或者制作一些数据和栏目没有对应关系的页 ...
- java—ThreadLocal模式与OSIV模式(53)
ThreadLocal: 维护线程局部的变量. ThreadLocal 不是线程.它就是一个Map.可以保存对象. 它保存的对象,只与当前线程相关. 当一个线程还没有运行完成时,如果不想传递数据,可以 ...
- windows环境下ElasticSearch5以上版本安装head插件
我的ElasticSearch版本是5以上的,网上搜了好多安装方式,都不对. 还好找到一个成功的,转载过来做记录. 原文地址:ElasticSearch-5.0安装head插件 步骤 下载node.j ...
- python中type、class、object的区别
type 一. type可以用来返回一个对象的类型 例如: 二. 由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点.type的 ...
- leetcode-278-First Bad Version(注意不要上溢)
题目描述:(说明中有简单翻译) You are a product manager and currently leading a team to develop a new product. Unf ...