剑指offer之31-35题解


目录

  1. 整数中1出现的次数(从1到n整数中1出现的次数)
  2. 把数组排成最小的数
  3. 丑数
  4. 第一个只出现一次的字符位置
  5. 数组中的逆序对

31. 整数中1出现的次数(从1到n整数中1出现的次数)

(一)题目描述

求出1~ 13的整数中1出现的次数,并算出100~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

(二)思路

  1. 详解见博客:https://www.cnblogs.com/xuanxufeng/p/6854105.html

(三)代码实现

public class Solution {public static int NumberOf1Between1AndN_Solution(int n) {int cnt = 0;for (int m = 1; m <= n; m *= 10) {int a = n / m, b = n % m;cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);}return cnt;}
}

32. 把数组排成最小的数

(一)题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

(二)思路

  1. 可以看成一个排序问题,在比较两个字符串S1和S2的大小时,应该比较的是S1+S2和S2+S1的大小,S1+S2<S2+S1,那么应该把S1排在前面,否则应该把S2排在前面。

(三)代码实现

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {public String PrintMinNumber(int[] numbers) {if (numbers == null || numbers.length == 0)return "";int n = numbers.length;String[] nums = new String[n];for (int i = 0; i < n; i++)nums[i] = numbers[i] + "";Arrays.sort(nums, (s1, s2) -> (s1 + s2).compareTo(s2 + s1));String ret = "";for (String str : nums)ret += str;return ret;}
}

33. 丑数

(一)题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包
含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

(二)思路

  1. 利用2,3,5循环相乘得到最小,即为第n个最小丑数。

(三)代码实现

public class Solution {public int GetUglyNumber_Solution(int index) {if (index <= 6)return index;int i2 = 0, i3 = 0, i5 = 0;int[] dp = new int[index];dp[0] = 1;for (int i = 1; i < index; i++) {int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5;dp[i] = Math.min(next2, Math.min(next3, next5));if (dp[i] == next2)i2++;if (dp[i] == next3)i3++;if (dp[i] == next5)i5++;}return dp[index - 1];}
}

34. 第一个只出现一次的字符位置

(一)题目描述

在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).

(二)思路

  1. 创建容量为256的int数组
  2. 遍历str,将它的字节加入int数组(比如字节a的int是97)
  3. 遍历str,如果出现的次数=1,则返回。

(三)代码实现

public class Solution {public int FirstNotRepeatingChar(String str) {int[] cnt = new int[256];for (int i = 0; i < str.length(); i++) cnt[str.charAt(i)]++;for (int i = 0; i < str.length(); i++) if (cnt[str.charAt(i)]==1)return i;return -1;}
}

35. 数组中的逆序对

(一)题目描述

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


(二)思路

  1. 先把数组分隔成子数组,统计出子数组内部的逆序对的数目,然后再统计出两个相邻子数组之间的逆序对的数目。

  2. 具体请参见博客:https://blog.csdn.net/qq_28081081/article/details/80804781,整体思路是一样的。

(三)代码实现

public class Solution {private long cnt = 0;private int[] tmp; //在这里声明辅助数组,而不是在merge()递归函数中声明public int InversePairs(int[] array) {tmp = new int[array.length];mergeSort(array, 0, array.length - 1);return (int) (cnt % 1000000007);}private void mergeSort(int[] array, int l, int h) {if (h - l < 1)return;int m = l + (h - l) / 2;mergeSort(array, l, m);mergeSort(array, m + 1, h);merge(array, l, m, h);}private void merge(int[] array, int l, int m, int h) {int i = l, j = m + 1, k = l;while (i <= m || j <= h) {if (i > m)tmp[k] = array[j++];else if (j > h)tmp[k] = array[i++];else if (array[i] <= array[j])tmp[k] = array[i++];else {tmp[k] = array[j++];this.cnt += m - i + 1;  //nums[i]>nums[j],说明nums[i...mid]都大于nums[j]}k++;}for (k = l; k <= h; k++) {array[k] = tmp[k];}}
}

剑指offer之31-35题解相关推荐

  1. 剑指offer——面试题35:第一个只出现一次的字符

    剑指offer--面试题35:第一个只出现一次的字符 Solution1: 垃圾算法不看也罢!自己想到的垃圾算法 class Solution { public:int FirstNotRepeati ...

  2. 【剑指offer】java版题解(持续更新)

    本文为刷[剑指]备战校招的过程,持续更新 备战虽晚但卷,共勉! 目录,按刷题时间排序 斐波那契数列 用两个栈实现队列 二维数组中的查找 包含min函数的栈 从尾到头打印链表 反转链表 复杂链表的复制 ...

  3. 剑指offer 面试31题

    面试31题: 题目:栈的压入.弹出元素 题:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序 ...

  4. [剑指offer]面试题35:第一个只出现一次的字符

    面试题35:第一个只出现一次的字符 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出'b'. 代码如下: char FirstNotRepeatin ...

  5. 剑指offer面试题[35]-第一个只出现一次的字符

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置. 分析:        这个题目最直观的思路是:从头开始扫描这个字符串 ...

  6. 剑指offer面试题35. 复杂链表的复制(DFS)(深拷贝)

    题目描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  7. C++剑指offer刷题笔记

    说明:本文是本人刷题后整理的剑指offer1-68题的题解笔记,编程语言为c++. 主要参考刷题笔记网址:leetcode剑指offer 次要参考刷题笔记网址:牛客剑指offer 剑指OFFER 面试 ...

  8. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  9. JS版剑指offer

    JS版剑指offer JS刷题总结 牛客网 递归算法的时间复杂度:递归的总次数*每次递归的数量. 递归算法的空间复杂度:递归的深度*每次递归创建变量的个数. 二叉树(12道): 剑指Offer(4): ...

  10. 剑指 Offer II 106. 二分图

    链接:剑指 Offer II 106. 二分图 题解: class Solution { private: // BFSbool setColor(vector<vector<int> ...

最新文章

  1. Different Layouts for Different Widths
  2. Py之glob: glob库文件名模式匹配+返回所有匹配的文件路径列表库的简介、使用方法之详细攻略
  3. C语言求一个数是否为armstrong阿姆斯特朗数(附完整源码)
  4. 使用ABAP和JavaScript代码生成PDF文件的几种方式
  5. 文本标注工具——doccano
  6. 【ubuntu】更换下载源
  7. php怎么截取数组最后元素,PHP如何获取数组最后一个元素的键和值?(图文+视频)...
  8. JanusGraph
  9. SVN下载安装及入门使用教程,详细到不能再详细了
  10. CPU占用100%的一般原因及解决办法
  11. python 分析qq聊天记录
  12. CCproxy 设置代理服务器。
  13. PCB设计中,如何快速消除PCB布线?
  14. __builtin_函数
  15. UE4+手柄对应按键测试
  16. Linux bridge agent状态xxx
  17. Python加密工具包pycrypto的安装
  18. Subversive or Subclipse
  19. Antd Pro V4 样式修改大全(有图有真相)
  20. linux没有网卡装置,基于Linux的虚拟网卡实现方法、装置、设备及介质与流程

热门文章

  1. mac 键盘映射优化配置
  2. 专业的PDF组件Spire.PDF for .NET V3.9.124发布|支持图标布局
  3. OpenStack运维面试(1)
  4. 如何选择免费网站监测工具?国外mon.itor.us还是国内监控宝!
  5. CodeForces - 1452E Two Editorials(二阶差分)
  6. CodeForces - 1332D Walk on Matrix(构造)
  7. Java接口四个类四则运算_用JAVA设计一个接口,声明有关算术运行的方法,并创建四个应用该接口的类,分别进行+-*/四则运算...
  8. 外挂学习之路(12)--- 用CE搜索字符串和搜索字符数组的区别
  9. PostgreSQL学习笔记3之表的继承和分区
  10. DLL入门浅析(3)——从DLL中导出变量