剑指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;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse安装插件的几种方式

前段时间Google转向了IDEA&#xff0c;貌似有些动摇了Eclipse作为Java领域IDE龙头老大的位置&#xff0c;为此引起了Eclipse粉丝和IDEA粉丝的集体骂战。类似这种骂战向来都不绝于耳&#xff0c;貌似程序员的都比较多&#xff0c;可能大家都是搞技术出身&#xff0c;都很自信。其…

炸窝(Collections当中的addAll方法)

public class aaa { public static void main(String[] args) {/** java.util.Collections是集合工具类&#xff0c;用来对集合进行操作&#xff0c;* * 集合Collections当中的两个方法&#xff1a;* 1.addAll方法&#xff1a;因为是静态方法&#xff0c;嗯所以可以.直接吹风机…

剑指offer:55-58记录

输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。 例如&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …

Map集合知识点(炸窝)

/** * 简单的介绍一下我们接下来准备学习的集合MAP集合 * * Map集合的简单概述&#xff1a; * 其中的健是不能进行重复的&#xff0c;而且每一健只能映射一个值&#xff0c;简单的说就是K与V是一一对应的&#xff0c;不能有其他的关系&#xff0c; * 但是我们注意到value值是可…

剑指offer:63-66记录

假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在第 5 天&#xff08;股票价格 6&a…

【大总结3】leetcode解题总览(算法、剑指offer、SQL、多线程、shell)

3/22更新 剑指offer 题目链接 建议大部分题都会做&#xff0c;都能比较快速且准确的写出来。关于做题方式&#xff0c;我的建议是&#xff1a;一道一道刷即可&#xff0c;因为难度一般&#xff0c;不用系统的学习什么知识&#xff0c;遇到实在不会的就跳过即可。 我这里写了…

逆序存储【数据结构】

C语言中malloc是动态内存分配函数。 函数原型&#xff1a;void malloc(unsigned int num_bytes); 参数&#xff1a;num_bytes 是无符号整型&#xff0c;用于表示分配的字节数。 返回值&#xff1a;如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定)&#xff0…

为什么 main 方法是 public static void ?

main 方法是我们学习Java编程语言时知道的第一个方法&#xff0c;你是否曾经想过为什么 main 方法是 public、static、void 的。当然&#xff0c;很多人首先学的是C和C&#xff0c;但是在Java中main方法与前者有些细微的不同&#xff0c;它不会返回任何值&#xff0c;为什么 ma…

返回地址【数据结构】

小问题&#xff1f; 1.我们是如何根据地址值来找到我们对应的数据的&#xff1f; 详细陈述一下&#xff1a;当我们开辟一个整数类型&#xff0c;取名为a&#xff0c;假设地址空间是从数值为2000进行存储&#xff0c;并且我们假设整形占用4个字节&#xff0c;那么我们在内存中需…

【超级详细的小白教程】Hexo 搭建自己的博客

– 前言 这是一篇有关如何使用 Github Pages 和 Hexo 搭建属于自己独立博客的详尽教程&#xff0c;本人是软件工程专业本科生&#xff0c;目前只学习了C和C编程语言&#xff0c;对网站开发的有关知识几乎为零&#xff0c;这也是我搭建好自己的博客之后写的第一篇博客&#xff…

面向对象思想精华总结

一、三大特性 封装继承多态 二、类图 泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (Association)依赖关系 (Dependency) 三、设计原则 S.O.L.I.D其他常见原则 参考资料 一、三大特性 封装 利用抽象数据类型将数据…

数组名与指向数组的指针之间的联系与区别【数据结构】

我们遇到一个非常棘手的问题&#xff0c;这个问题就是&#xff0c;对于一堆数据来说&#xff0c;我们进行存储&#xff0c;放到一个指定的仓库当中&#xff0c;先前我们使用数组加加标的形式进行访问仓库当中的元素位置&#xff0c;但是呢&#xff0c;现在我们使用的是一个指针…

Struts2的action中处理JSONP方式提交的中文乱码问题:

昨天在做公司网站的时候出现了一个中文乱码问题&#xff0c;让我郁闷了一晚上和一上午&#xff0c;最后在网友的提示下&#xff0c;我终于解决了&#xff0c;现在写出来供后来的兄弟们参考&#xff1a; 1.问题是这样的&#xff0c;就是客户端是以JSONP的方式提交的数据&#x…

leetcode509. 斐波那契数(矩阵快速幂)

斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 给定 N&#xff0c;计算 F(N)。…

insert函数的修改,

我们来看一下图片当中的第2个圆圈&#xff0c;为什么使用size来相加呢&#xff1f;我们知道一开始我们定义的初始空间为init_size;我们想一下啊&#xff0c;如果是第1次进行空间的增加&#xff0c;那么我们使用InIt来进行相加是可以的&#xff0c;但是当第2次想加我们再想开辟空…

leetcode520. py解字符串真是太残暴了

给定一个单词&#xff0c;你需要判断单词的大写使用是否正确。 我们定义&#xff0c;在以下情况时&#xff0c;单词的大写用法是正确的&#xff1a; 全部字母都是大写&#xff0c;比如"USA"。 单词中所有字母都不是大写&#xff0c;比如"leetcode"。 如果…

【数据结构】线性表大咖

循环链表的介绍 概念&#xff1a;链表的最后一个节点的指针&#xff0c;由原来的 空指针变成指向第1个节点的链表。 类比&#xff1a;我们进行串珠子的操作&#xff0c;将首尾通过线进行连接&#xff0c;同样我们的链表就是通过指针指向的方式进行连接&#xff0c;使其成为一…

leetcode551. 学生出勤记录 I

给定一个字符串来代表一个学生的出勤记录&#xff0c;这个记录仅包含以下三个字符&#xff1a; A : Absent&#xff0c;缺勤 L : Late&#xff0c;迟到 P : Present&#xff0c;到场 如果一个学生的出勤记录中不超过一个A(缺勤)并且不超过两个连续的L(迟到),那么这个学生会被奖…

一元多项式的表示和相加【数据结构】

一元多项式的表示和相加 运算只是一个定义&#xff0c;一切的一切&#xff0c;到最后都必须归咎于存储结构当中&#xff0c;实现物理存储&#xff0c;一元多项式包括数据对象数据关系以及数据之间的各种操作&#xff0c; 一元多项式的实现&#xff1a;用带表头结点的有序链表…

线性结构基本概念【数据结构】F

线性表的概念&#xff1a;线性表是一种最简单的线性结构&#xff0c;线性结构是单个数据元素的有序结合 线性结构的基本特征为&#xff1a; 第一&#xff0c;集合中必存在唯一的一个第1元素&#xff0c; 第二&#xff0c;集合中必存在唯一的一个最后元素&#xff0c; 第三&am…