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. XML--将XML中数据提取出转换成表2

    DECLARE @xml XMLSET @xml = '<Students>    <Student  id="1001" name = "xu&quo ...

  2. django 定制管理页面外观 模板文件不生效的解决方法

    问题描述:大概过程跟下面描述的一样,简单来说就是照着例子学习的时候定制管理页面外观,按照文档要求拷贝了base_site.html文件到templates目录下,并且按照要求修改了settings.p ...

  3. python3环境的搭建

    Python3 下载 Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到: Python 官网:https://www.python.org/ 你可以在以下链接中下载 ...

  4. python--变量,常量,用户交互

    1.变量 概念:把程序运行过程中产生的中间值保存在内存,方便后面使用 命名规范: 1.字母,数字,下划线组成 2.不能用数字开头,且不能用纯数字 3.不能用python关键字 4.不要用中文 5.要有 ...

  5. Hello world(世界,你好)

    每一个学习语言的小白,第一行代码就是向世界问好,话不多,大圣要开始自己的代码人生了! 一.字符串是可以相加的,比如:print("hello"+"world") ...

  6. java public class和class的区别

  7. [agc006f] Blackout 神题

    Description ​ 给你一个NN行NN列的网格,第ii行第jj列的格子用(i,j)(i,j)表示 一开始的时候有MM个格子被涂成黑色,其他的格子都是白色,具体一点,涂成黑色的格子为(a1,b1 ...

  8. 如何检查 IP是否冲突了

     [root@TEST_192_168_1_252 ~]# ifconfig eth0      Link encap:Ethernet  HWaddr 44:A8:42:00:1A:B5       ...

  9. 如何将Ajax请求从异步改为同步

    Ajax请求默认的都是异步的 如果想同步 async设置为false就可以(默认是true) var html = $.ajax({   url: "some.PHP",   as ...

  10. iOS --UIScrollView的学习(三)自动轮播

    1.前面两章讲的都是基本的用法,这次讲一下比较重要的功能分页和自动播放 2.UIPageControl--分页 2.1只要将UIScrollView的pageEnabled属性设置为YES,UIScr ...