6090. 极大极小游戏
https://leetcode.cn/problems/min-max-game/
思路:简单模拟。在循环中每次创建一个临时数组,对这个临时数组按规则进行求值运算,运算完后临时数组作为新的数组nums, 在Java中数组是引用类型,因此只需要nums=tmp即可
class Solution {
public int minMaxGame(int[] nums) {
int n=nums.length;
int[] ans;
while(n!=1) {
ans=new int[n/2];//临时数组
for(int i=0;i<ans.length;i++) {
if(i%2==0) {//计算偶数下标的值
ans[i]=Math.min(nums[2*i],nums[2*i+1]);
}else {//计算奇数下标的值
ans[i]=Math.max(nums[2*i],nums[2*i+1]);
}
}
nums=ans;//更新数组
n/=2;
}
return nums[0];//最后的数组只剩下一个元素
}
}
6091. 划分数组使最大差为 K
https://leetcode.cn/problems/partition-array-such-that-maximum-difference-is-k/
思路:排序+贪心,由于是子序列,因此排完序后的选取和排序之前的选取效果是一样的,拍完序之后,从前往后选取元素,直到max-min>k, 这样使得每一个分组中的元素个数最多,从而整体的分组数最少
class Solution {
public int partitionArray(int[] nums, int k) {
Arrays.sort(nums);
int ans=0;
int minNum=nums[0];
for(int i=1;i<nums.length;i++) {
if(nums[i]-minNum>k) {//max-min>k 需要增加一个分组
ans++;
minNum=nums[i];
}
}
ans++;
return ans;
}
}
6092. 替换数组中的元素
https://leetcode.cn/problems/replace-elements-in-an-array/
思路:使用一个map先记录原数组nums中元素和位置的映射,当遍历operations时,operations[i][0]
作为key可以在nums找到对应的下标,再将对应的下标元素修改为operations[i][1]
, 注意的一点时修改完之后,需要更新一下map, 因为数组nums某个对应的值被修改了
class Solution {
public int[] arrayChange(int[] nums, int[][] operations) {
HashMap<Integer, Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++) {
map.put(nums[i],i);
}
for(int[] op:operations) {
int num=op[0];
int val=op[1];
int index=map.get(num);
nums[index]=val;
map.put(val, index);
}
return nums;
}
}
6093. 设计一个文本编辑器
https://leetcode.cn/problems/design-a-text-editor/
思路:使用StringBuilder进行模拟
class TextEditor {
StringBuilder sb;
int cur;
public TextEditor() {
sb=new StringBuilder();
cur=0;//光标位置 cur=cur的左边字符串长度
}
public void addText(String text) {
sb.insert(cur, text);
cur+=text.length();
}
public int deleteText(int k) {
int realLeftLen=cur;//cur左边的字符串长度
if(realLeftLen<k) {//不足k个
sb.delete(0, 0+realLeftLen);//左边的字符串全删了
cur=0;//cur指向0
return realLeftLen;
}else {//足k个
sb.delete(cur-k, cur);//删除cur左边的k个字符
cur=cur-k;//cur往左移动k个位置
return k;
}
}
public String cursorLeft(int k) {
if(cur<=k) {//cur左边的字符个数<=k
cur=0;//往左移动k个位置 相当于到0的位置
return "";
}else {//cur左边的字符个数>k
cur-=k;//cur往左移动k个位置
int index=cur>=10?cur-10:0;//移动完之后cur左边字符个数是否大于等于10?
//>=10 取cur左边10个字符 <10 取左边所有字符
return sb.substring(index,cur);
}
}
public String cursorRight(int k) {
int len=sb.length();
if(cur+k>len) {//cur往右移动k个位置越界了
cur=len;//cur指向最后一个位置
int index=cur>=10?cur-10:0;
return sb.substring(index,cur);
}else {
cur+=k;//cur往右移动k个位置
int index=cur>=10?cur-10:0;
return sb.substring(index,cur);
}
}
}