剑指offer:50-53记录
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。
示例:
s = "abaccdeff"
返回 "b"
s = ""
返回 " "
限制:
0 <= s 的长度 <= 50000
思路:map记录次数,再次遍历找出次数1的。
class Solution {public char firstUniqChar(String s) {// 哈希表存储,<字符,出现次数>Map<Character,Integer> map=new HashMap<>();for(int i=0;i<s.length();i++){if(map.containsKey(s.charAt(i))){map.put(s.charAt(i),map.get(s.charAt(i))+1);}else{map.put(s.charAt(i),1);}}//顺序判断,只要找到第一个出现次数为1的就返回for(int i=0;i<s.length();i++){if(map.get(s.charAt(i))==1)return s.charAt(i);}return ' ';}
}
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
归并加一句统计。
class Solution {private int res;public int reversePairs(int[] nums) {if (nums == null || nums.length < 1) {return 0;}mergeSort(nums, 0, nums.length - 1);return res;}private void mergeSort(int[] arr, int left, int right) {if (left == right) {return;}int mid = (left + right) >>> 1;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}private void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];int i = left, j = mid + 1, index = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[index++] = arr[i++];} else {temp[index++] = arr[j++];//加一句res += mid - i + 1;}}while (i <= mid) {temp[index++] = arr[i++];}while (j <= right) {temp[index++] = arr[j++];}System.arraycopy(temp, 0, arr, left, temp.length);}
}
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
思路:先都走到最后,顺便统计长度。
结尾不一样就肯定没有相交,返回。
然后让长的先几步,走到一样长了再一起往前走,相遇就找到了。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headB==null || headA==null){return null;}ListNode tempA=headA;ListNode tempB=headB;int a=0;int b=0;while(tempA.next!=null){tempA=tempA.next;a++;}while(tempB.next!=null){tempB=tempB.next;b++;}if(tempB!=tempA){return null;}tempA=headA;tempB=headB;if(a>b){for(int i=0;i<a-b;i++){tempA=tempA.next;}}else{for(int i=0;i<b-a;i++){tempB=tempB.next;}}while(tempB!=tempA){tempA=tempA.next;tempB=tempB.next;}return tempA;}
}
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
思路:两次二分,稍微修改一下查最左或最右。最后相减即可。
class Solution {public int search(int[] nums, int target) {int left=searchRangeLeft(nums,target);int right=searchRangeRight(nums,target);if(left==-1)return 0;return right-left+1;}public int searchRangeLeft(int[] nums, int target) {int left=0;int right=nums.length-1;while(left<=right){int mid=(left+right)/2;if(nums[mid]>target){right=mid-1;}else if(nums[mid]<target){left=mid+1;}else if(mid==0 || nums[mid-1]!=target){return mid;}else{right=mid-1;}}return -1;}public int searchRangeRight(int[] nums, int target) {int left=0;int right=nums.length-1;while(left<=right){int mid=(left+right)/2;if(nums[mid]>target){right=mid-1;}else if(nums[mid]<target){left=mid+1;}else if(mid==nums.length-1 || nums[mid+1]!=target){return mid;}else{left=mid+1;}}return -1;}
}
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
思路1:异或,就一个没出现的剩下了,别的两两抵消了。
class Solution {public int missingNumber(int[] nums) {int res=nums.length;for(int i=0;i<nums.length;i++){res^=nums[i];res^=i;}return res;}
}
思路2:二分,条件就是值是否等于下标。
class Solution {public int missingNumber(int[] nums) {int left = 0;int right = nums.length-1;while(left<=right){int mid = (left+right) / 2;if(nums[mid]!=mid) right = mid -1;else left = mid + 1;}return left;}
}
剑指offer:50-53记录相关推荐
- 【LeetCode】剑指 Offer 50. 第一个只出现一次的字符
[LeetCode]剑指 Offer 50. 第一个只出现一次的字符 文章目录 [LeetCode]剑指 Offer 50. 第一个只出现一次的字符 一.哈希表 二.有序哈希表 本题考查哈希表的使用, ...
- 剑指offer刷题记录 python3 Java
剑指offer刷题记录 python3 Java 剑指 Offer 09. 用两个栈实现队列 剑指 Offer 10- I. 斐波那契数列 剑指 Offer 03. 数组中重复的数字 [★]剑指 Of ...
- 剑指offer做题记录
1. 剑指 Offer 03. 数组中重复的数字 力扣 class Solution { public:int findRepeatNumber(vector<int>& nu ...
- 剑指Offer 刷题记录
文章目录 剑指offer题目 01. 二维数组中的查找 02. 替换空格 03. 从尾到头打印链表 04. 重建二叉树 05. 两个堆栈模拟一个队列 06. 旋转数组的最小数字 07. 斐波那契数列 ...
- 剑指offer刷题记录(上)
记录刷题过程,方便自己后期回顾 题目来自<剑指offer>,在牛客上OC,思路大多来自剑指offer,偶尔来自自己的碎碎念,代码自己瞎写的,如果有更优的方法请告诉我,谢谢大佬们 语言:py ...
- 剑指offer:39-42记录
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输 ...
- string类函数和牛客网剑指offer刷题记录
1.strcat char* strcat(char *strDest,const char *strSrc){assert(strDest && strSrc);char *p = ...
- 剑指offer:63-66记录
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候 ...
- 剑指offer:33-37记录
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树: 5 / \ ...
最新文章
- 佛吉尼亚大学计算机世界排名,弗吉尼亚大学计算机世界排名
- 基于Vue.js的精选壁纸推荐单页应用
- linux java 生成证书_Java 制作证书(Windows 和Linux)
- 设计模式的理解 : 门面模式、外观模式 (Facade)
- 字符函数和内存函数模拟实现
- 小师妹学JavaIO之:目录还是文件
- 让Spring架构减化事务配置(转)
- AppTheme 属性详解
- re.containerbase.startinternal 子容器启动失败_微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)...
- HINSTANCE HANDLE HWND 的区别及一般方法
- abaqus如何快速导入其他cae文件的assembly?
- Vim配置#pathogen插件管理工具
- jQuery学习(菜鸟教程)
- CloudFlare Workers 设置使用自定义域名
- 怎么把手机中的照片做成视频?原来这么简单就可以,涨知识了
- Unix环境高级编程 笔记
- 关于使用PyQt5时报错This application failed to start because no Qt platform plugin could be initialized及后续问题
- 搭建环境,创建vue3+typescript+vuetify项目
- AltiumDesigner 绘制PCB常见问题
- Vmware Ubuntu 无法解析域名解决
热门文章
- linux用while循环输出1到10,Linux Shell系列教程之(十一)Shell while循环 | Linux大学...
- i2c_add_driver函数用法
- SIP 中的Dialog,call,session 和 transaction .
- java enumeration 排序_Java如何对java.util.Enumeration进行排序?
- mysql 增量备份脚本_MySQL自动化(全量+增量)备份脚本
- 由于在客户端检测到一个协议错误_TLS协议的分析
- maple 2018 窗口关闭提示乱码_如果解决SOLIDWORKS工程图转CAD字体出现乱码的问题_SolidWorks生信科技...
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(安装TensorFlow2.0)
- Sharepoint学习笔记 –架构系列—10 Sharepoint的服务器端对象模型(Server Object Model) 2.内容层次结构
- 第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)