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)编程题的更多相关文章

  1. 剑指 Offer 31. 栈的压入、弹出序列

    剑指 Offer 31. 栈的压入.弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某 ...

  2. 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题

    剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...

  3. 剑指offer 面试35题

    面试35题: 题目:复杂链表的复制 题:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中 ...

  4. 剑指offer(35)数组中的逆序对

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

  5. 【Java】 剑指offer(31) 栈的压入、弹出序列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否 ...

  6. 【剑指Offer】俯视50题之31 - 40题

    面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面试题36数组中的逆序对 面试题37两个链表的第一 ...

  7. 每日一题 - 剑指 Offer 31. 栈的压入、弹出序列

    题目信息 时间: 2019-06-25 题目链接:Leetcode tag:栈 难易程度:中等 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入 ...

  8. [持久更新] 剑指offer题目Python做题记录

    第一题 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:先快速定位到 ...

  9. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...

  10. 【剑指Offer】俯视50题之21 - 30题

    面试题21包括min函数的栈  面试题22栈的压入.弹出序列  面试题23从上往下打印二叉树  面试题24二叉搜索树的后序遍历序列  面试题25二叉树中和为某一值的路径  面试题26复杂链表的复制  ...

随机推荐

  1. View Pi's Status on WebBrowser

    1. install php and cgi support sudo apt-get install php5-common sudo apt-get install php5-cgi sudo a ...

  2. 基于Extjs的web表单设计器

    由于这样工作和自身的一些原因很长一段时间没有写过博客了.最近想把自己前面一段时间搞出的一个表单设计器的相关经验或者经历记录下来.分享给大家,也算是对自己前2个月的一个总结回顾吧. 首先介绍一下开发此版 ...

  3. 在TFS 2013的迭代视图中修改工作项数目限制

    当TFS迭代中的工作项数目超过500时,在TFS的网页(Web Access)显示中就会出现红色警告提示"积压工作(backlog)中的项数超出配置的限制500.当前总数为529-.&quo ...

  4. C#学习(2):委托

    1.疑问: 1.委托是什么? 2.为什么需要委托? 3.委托能用来做什么? 4.如何自定义委托? 5..NET默认的委托类型有哪几种? 6.怎样使用委托? 7.多播委托是什么? 8什么是泛型委托? 9 ...

  5. oracle中的序列,可以解决自增各种编号自动增长问题,说一下我的小问题。

    1.生成0001-9999的编码 //在PL/sql中 创建一个序列 Create sequence seq_cdptIncrement by 1 --自增数Start with 1 --开始累加数M ...

  6. h5页面宽度设置7.5rem

    function ready() { var u = navigator.userAgent; var winW = document.documentElement.clientWidth; if ...

  7. MVC页面移除HTTP Header中服务器信息

    默认情况下,每一个MVC请求的HTTP Header中都会包含着当前服务器的一些信息,出于安全还是性能还是处女座的强迫症等等,都想把这些信息移除掉,增加一些应用程序的神秘感,如下,默认情况下Chrom ...

  8. pymongo 学习

    查看一条记录,返回一条 dict 记录 db.Account.find_one({"UserName":"keyword"}) 查看某一列的一条记录(此时的1, ...

  9. Jmeter之线程组详解

    hello,更新几天的分享,线程数现在才分享,感觉怪怪的,原谅我没有考虑到一个顺序问题哈,那里总结好了,我就发那里,先把组件都写完,再来项目实战,希望大家不要责怪哈,内容有写的不详细的,或者我说错了, ...

  10. Linux之virtualbox中的ubuntu虚拟机linux系统共享文件夹

    windows通过virtualbox软件与linux系统机型文件共享 1.第一步 在设置中找到共享文件夹选项,选择添加共享文件夹 2.第二步 选择需要与linux进行共享的文件夹,并选择固定分配 3 ...