刷题记录-移除元素
移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
思路:简单来说就是两件事,一是找到数组中不等于val的元素个数并返回。一个for循环即可。二是将数组中不等于val都放到前面。顺序不定。另一个for循环,将数组后面不等于val与前面等于val的交换位置。O(n)
public int removeElement(int[] nums, int val) {
int res= nums.length;
for (int i = 0; i <=nums.length-1 ; i++) {
if(nums[i]==val){
res-=1;
}
}
int high=nums.length-1;
for (int i = 0; i < res; i++) {
if (nums[i]==val){
while (nums[high]==val&high>res){
high-=1;
}
nums[i]=nums[high];
nums[high]=val;
}
}
return res;
}
删除排序数组中的有序项
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
-
更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 -
返回
k
。示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
思路:第一种做法复杂了,有一个新数组来存,j指向当前赋值的位置。第0个位置默认赋值。后面找到不一样的就赋值。实际不需要两个数组,在原来数组上用两个指针即可。一个指向赋值的位置,一个指向当前不同的位置。
解法一:
public int removeDuplicates(int[] nums) {
int res= nums.length,j=0;
int [] nums1=new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if(i==0){
nums1[j]=nums[i];
j++;
continue;
}
if (nums[i]==nums[i-1]){
res-=1;
continue;
}
nums1[j]=nums[i];
nums[j]=nums1[j];
j++;
}
return res;
}
解法二
public int removeDuplicates(int[] nums) {
int j=0;
for (int i = 1; i < nums.length; i++) {
if(nums[i]!=nums[j]){
j++;
nums[j]=nums[i];
}
}
return j+1;
}
移动0
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
public void moveZeroes(int[] nums) {
if(nums.length<2){
return;
}
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了
//所以第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
第一遍历将所有非0值放到前面,第二次将数组后面的元素赋值为0
比较含空格的字符串
给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。
示例 2:
输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。
示例 3:
输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。
思路。用两个栈,将st中的字母分别换成两个数组即可
public boolean backspaceCompare(String s, String t) {
char[] s1=new char[s.length()];
char temp=s1[0];
int num=0,num1=0;
char[] s2=new char[t.length()];
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)!='#'){
s1[num++]=s.charAt(i);
}
else {
if(num==0){
continue;
}
s1[--num]=temp;
}
}
for (int i = 0; i < t.length(); i++) {
if(t.charAt(i)!='#'){
s2[num1++]=t.charAt(i);
}
else {
if(num1==0){
continue;
}
s2[--num1]=temp;
}
}
if(num1!=num){
return false;
}
for (int i = 0; i < num; i++) {
if (s1[i]!=s2[i]){
return false;
}
}
return true;
}
有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
思路:
这题我写了很多判断,没想到更好的方式。主要因为原数组是递增的,因此可以分以下三种情况
nums最大值小于等于0,此时数组全是负数,将所有元素调过来即可
nums最小值大于等于0,这种最简单,直接原数组平方
除此之外的第三种,即数组内有正有负。此时新开一个数组,从最后开始赋值,用两个指针记录当前比较nums的位置,每次取绝对值的平方赋值即可。代码如下:
public int[] sortedSquares(int[] nums) {
if(nums.length<2){
nums[0]=nums[0]*nums[0];
return nums;
}
if (nums[0] >= 0) {
for (int i = 0; i < nums.length; i++) {
nums[i]=nums[i]*nums[i];
}
return nums;
}
if (nums[nums.length-1]<=0){
for (int i = 0; i < nums.length/2; i++) {
int temp=nums[i];
nums[i]=nums[nums.length-1-i];
nums[nums.length-1-i]=temp;
nums[i]=nums[i]*nums[i];
nums[nums.length-1-i]=nums[nums.length-1-i]*nums[nums.length-1-i];
}
if(nums.length%2!=0){
nums[nums.length/2]=nums[nums.length/2]*nums[nums.length/2];
}
return nums;
}
int p=nums.length-1;
int q=p,j=0;
int[] nums1=new int[p+1];
while (j!=q){
if(nums[j]<0){
while (-nums[j]<nums[q]){
nums1[p]=nums[q]*nums[q];
q--;
p--;
}
if(j==q){
break;
}
nums1[p]=nums[j]*nums[j];
p--;
j++;
}
else {
nums1[p]=nums[q]*nums[q];
q--;
p--;
}
}
nums1[0]=nums[j]*nums[j];
return nums1;
}
标签:nums,int,元素,++,length,数组,移除,刷题
From: https://www.cnblogs.com/hfutxcj/p/17785708.html