1.极大极小游戏
简单题,通过数组下标操作,可得出答案
class Solution {
public:
int minMaxGame(vector<int>& res) {
int n=res.size();
vector<int>nums=res;
n=n/2;
int a=2;
int k=1;
while(n)
{
int i=0;
for(int i=0;i<n;i++)
{
if(i%2==0)
{
nums[a*i]=min(nums[a*i],nums[a*i+k]);
}
else
{
nums[a*i]=max(nums[a*i],nums[a*i+k]);
}
}
n=n/2;
a=a*2;
k=k*2;
}
return nums[0];
}
};
2.划分数组使最大差为 K
排序+贪心
class Solution {
public:
int partitionArray(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
int n=nums.size();
int ans=1;
for(int i=0,j=0;i<n;i++)
{
if(nums[i]-nums[j]>k)
{
ans++;
j=i;
}
}
return ans;
}
};
3. 替换数组中的元素
hash+模拟
class Solution {
public:
vector<int> arrayChange(vector<int>& nums, vector<vector<int>>& s) {
unordered_map<int,int>hash;
for(int i=0;i<nums.size();i++)
{
hash[nums[i]]=i;
}
for(auto&x:s)
{
int index=hash[x[0]];
nums[hash[x[0]]]=x[1];
hash.erase(x[0]);
hash[x[1]]=index;
}
return nums;
}
};
4.设计一个文本编辑器
链表模拟,我只会暴力,我是five。。。。。
class TextEditor {
list<char>lst;
list<char>::iterator cur;
string print()
{
string ret;
auto it=cur;
for(int i=0;i<10;i++)
{
if(it==lst.begin()) break;
it =prev(it);
ret.push_back(*it);
}
reverse(ret.begin(),ret.end());
return ret;
}
public:
TextEditor() {
cur=lst.begin();
}
void addText(string text) {
for(char c:text) lst.insert(cur,c);
}
int deleteText(int k) {
int ret=0;
while(k&&cur!=lst.begin())
{
cur=prev(cur);
cur=lst.erase(cur);
k--,ret++;
}
return ret;
}
string cursorLeft(int k) {
while(k&&cur!=lst.begin())
{
cur=prev(cur);
k--;
}
return print();
}
string cursorRight(int k) {
while(k&&cur!=lst.end())
{
cur=next(cur);
k--;
}
return print();
}
};