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. Python学习-12.Python的输入输出

    在Python中,输出使用print函数,之前用过了. 输入的话,则使用input函数. var = input() print('you input is' + var) 输入haha则将输出you ...

  2. AngularJS Backbone.js Ember.js 对比

    看到一篇关于AngularJS Backbone Ember.js的对比,建议看一看 说说个人的观点(本人学艺不精,只是个人的观点,不保证观点完全正确,请轻拍): backbone.js 短小精悍,非 ...

  3. GBK还是UTF-8? Eclipse连接TFS的编码之痛!encoding, encoding, encoding…

    在中文Windows操作系统上安装Eclipse或MyEclipse,默认会将Eclipse的编码设置为GBK,与操作系统的默认编码保存一致. 在这种默认设置下,在Eclipse新增的文件不会自动被团 ...

  4. [JAVA]java复制文件的4种方式

    尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...

  5. Android Preferences: How to load the default values when the user hasn't used the preferences-screen?

    在启动 preferences 之前,默认值并不能生效.第一次运行程序时候,默认值没生效,然后获取的 preferences 的值就是错误的. 解决办法是在程序开始时加一行代码使默认值生效. Pref ...

  6. C语言的第零次作业

    C语言--第0次作业 Q1:对于网络专业的了解 一开始我对网络工程这个专业并不是很了解,在报志愿之前,我完全没想过自己会进这个专业,但是经过了一个暑假的时间,我慢慢地开始了解这个学科,并开始对这个专业 ...

  7. XSS结合JSONP获取网站访客社交账号信息

    我在本地环境搭建了一个WordPress网站,并在该网站中植入JavaScript文件.如果访客在浏览网站时登录了百度账号,该js文件能够利用JSONP获取网站访客的百度账号信息. 具体情况如下: 1 ...

  8. kolla-ansible 重新部署 ceph-mon 组件

    1.备份数据 [root@controller ~]# mv /var/lib/docker/volumes/ceph_mon /var/lib/docker/volumes/ceph_backup/ ...

  9. Hello world(世界,你好)

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

  10. Zipper(动态规划)

    点击打开链接 描述 Given three strings, you are to determine whether the third string can be formed by combin ...