沉浸式求职学习
移除元素
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
- 返回 k
class Solution {
public int removeElement(int[] nums, int val) {
int left=0;
for(int right=0;right<nums.length;right++)
{
if(nums[right]!=val)
{
nums[left] = nums[right];
left++;
}
}
return left;
}
}
一个指针是left,另一个是right,right只负责遍历,如果查到nums[right]与你的目标值不同,就把这个值存给nums[left],最后返回Left的个数即可。
删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
class Solution {
public int removeDuplicates(int[] nums) {
int slow=0;
int n = nums.length;
for(int fast=0;fast<n;fast++)
{
if(nums[fast]!=nums[slow])
{
slow++;
nums[slow] = nums[fast];
}
}
return slow+1;
}
}
我第一次做的时候犯了个错误
我返回了数组的length,所以报错了
要注意,我们只是移动了数组,并没有直接进行增删,所以要返回不重复元素的数目,也就是slow+1;
比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
class Solution {
public boolean backspaceCompare(String s, String t) {
char[] s1 = s.toCharArray();
char[] s2 = t.toCharArray();
return tuige(s1).equals(tuige(s2));
}
public String tuige(char[] s)
{
int slow=0;
int n = s.length;
for(int right=0;right<n;right++)
{
if(s[right] != '#')
{
s[slow] = s[right];
slow++;
}
else
{
if(slow>0)slow--;
}
}
return new String(s,0,slow);
}
}
注意的两个地方:
- slow-- 这里 一定要有个前置条件 如果slow>0,不然成负数了
- 返回值,我最开始写的是s.toString(),但是数组中没重写toString方法,所以返回的是一个地址(类名+哈希码)
- 然后针对返回值,我又用了Arrays.toString(s),发现还是报错,这是因为,**Arrays.toString(s)**返回的是一个数组的内容的字符串,假设我们数组是[a,b],它返回的字符串就是[a,b],而不是我们想要的ab。所以影响后续判断
- 所以最好的方法就是new String(s),然后截取有效部分。
有效数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
class Solution {
public int[] sortedSquares(int[] nums) {
int slow=0;
int n = nums.length;
int[] new_nums = new int[n];
int fast=n -1;
for(int i=n-1;i>=0;i--)
{
if(nums[fast]*nums[fast]>nums[slow]*nums[slow])
{
new_nums[i] = nums[fast]*nums[fast];
fast--;
}
else
{
new_nums[i] = nums[slow]*nums[slow];
slow++;
}
}
return new_nums;
}
}
这个题可以采用一个for循环再加个sort解决;
但是如果要求一些算法的话还是采用双指针。
两个指针,一个从左,一个从右,右边的指针负责从结尾向第一个元素变量,左边的指针负责从第一个元素向最后一个元素遍历。同时它俩作比较,如果右边的大,那么就给数组的最后一位赋这个更大的值,同时右边的指针左移,在和左边的指针比;如果右边的小,那么就把更大值赋给数组,同时左边的指针向右边移动。