目录
26.删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
class Solution {
public int removeDuplicates(int[] nums) {
int j=0;
for(int i=1;i<nums.length;i++){
if(nums[j]!=nums[i]){
nums[j+1]=nums[i];
j++;
}
}
return j+1;
}
}
283.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
class Solution {
public void moveZeroes(int[] nums) {
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j]=nums[i];
if(i!=j){
nums[i]=0;
}
j++;
}
}
}
}
925.长按键入
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。
你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。
示例 1:
输入:name = "alex", typed = "aaleex"
输出:true
解释:'alex' 中的 'a' 和 'e' 被长按。
示例 2:输入:name = "saeed", typed = "ssaaedd"
输出:false
解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。
示例 3:输入:name = "leelee", typed = "lleeelee"
输出:true
示例 4:输入:name = "laiden", typed = "laiden"
输出:true
解释:长按名字中的字符并不是必要的。
提示:
name.length <= 1000
typed.length <= 1000
name 和 typed 的字符都是小写字母。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/long-pressed-name
class Solution {
public boolean isLongPressedName(String name, String typed) {
if(name.charAt(0)!=typed.charAt(0)){
return false;
}
int flagLen=0;
int j=0;
boolean flag=true;
for(int i=0;i<typed.length();i++){
if(j==name.length()){
if(typed.charAt(i)!=name.charAt(j-1)){
flag=false;
break;
}
}else{
if(typed.charAt(i)==name.charAt(j)){
j++;
flagLen++;
}else{
if(typed.charAt(i)!=name.charAt(j-1)){
flag=false;
break;
}
}
}
}
return flagLen==name.length()&&flag;
}
}
面试题04.二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]
给定 target =
5
,返回true
。给定 target =
20
,返回false
。
限制:
0 <= n <= 1000
0 <= m <= 1000
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length==0){
return false;
}
int i=matrix.length-1;
int j=0;
while(true){
if(i<0|j>=matrix[0].length){
break;
}
if(matrix[i][j]==target){
return true;
}
if(matrix[i][j]<target){
j++;
}else{
i--;
}
}
return false;
}
}
532.数组中的K-diff数对
给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.
示例 1:
输入: [3, 1, 4, 1, 5], k = 2 输出: 2 解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。 尽管数组中有两个1,但我们只应返回不同的数对的数量。
示例 2:
输入:[1, 2, 3, 4, 5], k = 1 输出: 4 解释: 数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。
示例 3:
输入: [1, 3, 1, 5, 4], k = 0 输出: 1 解释: 数组中只有一个 0-diff 数对,(1, 1)。
注意:
- 数对 (i, j) 和数对 (j, i) 被算作同一数对。
- 数组的长度不超过10,000。
- 所有输入的整数的范围在 [-1e7, 1e7]。
class Solution {
public int findPairs(int[] nums, int k) {
int count=0;
Arrays.sort(nums);
int j=0;
int i=0;
for(j=0;j<nums.length;j++){
if(j!=0&&nums[j]==nums[j-1]){
continue;
}
for(i=j+1;i<nums.length;i++){
if(i!=j+1&&nums[i]==nums[i-1]){
continue;
}
if(Math.abs(nums[j]-nums[i])==k){
count++;
}
}
}
return count;
}
}
977.有序数组的平方
给定一个按非递减顺序排序的整数数组
A
,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例 1:
输入:[-4,-1,0,3,10] 输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11] 输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
已按非递减顺序排序。
class Solution {
public int[] sortedSquares(int[] A) {
int[] B=new int[A.length];
int i=0;
int j=A.length-1;
int z=A.length-1;
while(true){
if(i>j){
break;
}
if(A[i]*A[i]>A[j]*A[j]){
B[z--]=A[i]*A[i];
i++;
}else{
B[z--]=A[j]*A[j];
j--;
}
}
return B;
}
}
88.合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums=new int[nums1.length];
for(int i=0;i<m;i++){
nums[i]=nums1[i];
}
int i=0;
int j=0;
int z=0;
while(true){
if(z==nums.length){
break;
}
if(i<m&&j<n){
if(nums[i]>nums2[j]){
nums1[z++]=nums2[j++];
}else{
nums1[z++]=nums[i++];
}
}else if(i==m){
nums1[z++]=nums2[j++];
}else if(j==n){
nums1[z++]=nums[i++];
}
}
}
}
349.两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4]
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int i=0;
int j=0;
int[] num=new int[nums1.length];
int z=0;
while(true){
if(i==nums1.length||j==nums2.length){
break;
}
if(i!=0&&nums1[i]==nums1[i-1]){
i++;
continue;
}
if(j!=0&&nums2[j]==nums2[j-1]){
j++;
continue;
}
if(nums1[i]==nums2[j]){
num[z++]=nums1[i];
i++;
j++;
}else if(nums1[i]>nums2[j]){
j++;
}else{
i++;
}
}
int[] ans=new int[z];
for(int k=0;k<z;k++){
ans[k]=num[k];
}
return ans;
}
}
830.较大分组的位置
在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。
例如,在字符串 S = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。
我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。
最终结果按照字典顺序输出。
示例 1:
输入: "abbxxxxzzy"
输出: [[3,6]]
解释: "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
示例 2:输入: "abc"
输出: []
解释: "a","b" 和 "c" 均不是符合要求的较大分组。
示例 3:输入: "abcdddeeeeaabbbcd"
输出: [[3,5],[6,9],[12,14]]
说明: 1 <= S.length <= 1000来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/positions-of-large-groups
class Solution {
public List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> lis = new ArrayList();
List<Integer> inlis = new ArrayList();
int i=0;
int j=0;
int count = 0;
while(true){
if(S.charAt(i)==S.charAt(j)){
count++;
j++;
}else{
if(count>=3){
inlis.add(i);
inlis.add(i+count-1);
lis.add(inlis);
inlis = new ArrayList();
}
i=j;
count=0;
}
if(j>=S.length()){
if(count>=3){
inlis.add(i);
inlis.add(i+count-1);
lis.add(inlis);
inlis = new ArrayList();
}
i=j;
count=0;
break;
}
}
return lis;
}
}