暑假算法7.23,Day22

这篇博客主要介绍了三道关于字符串操作的算法题目,包括字符串反转、裁剪数字后的查找以及文本编辑器的设计。第一题展示了如何反转字符串的奇数位置字符;第二题涉及从数字字符串中截取子串并找到特定位置的数字;第三题则设计了一个文本编辑器,实现了添加文本、删除字符以及光标左右移动的功能。通过这些实例,博主旨在提升字符串处理能力。
摘要由CSDN通过智能技术生成
暑假算法7.23,Day22

字符串

终于到字符串啦,比赛很多字符串的题目,写出来的少之又少,希望可以得到提升吧,加油!!

第一题

反转字符串||

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.length();
        for (int i = 0; i < n; i += 2 * k) {
            reverse(s.begin() + i, s.begin() + min(i + k, n));
        }
        return s;
    }
};

请添加图片描述

第二题

裁剪数字后查询第k小的数字

class Solution {
public:
    vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
        vector<int> ans(queries.size(),0);
        //记录每个字符串的长度为多少
        int nSize = nums[0].size();
        //循环遍历query
        for(int i=0;i<queries.size();i++){
            //得到二维数组中每一行的k和trim
            int k = queries[i][0];
            int trim=queries[i][1];
            //存取截取的数,以及其下标
            vector<pair<string,int>> t(nums.size());
            //遍历nums,存取截取后的字符串以及对应的下标
            for(int j=0;j<nums.size();j++){
                //String为截取的字符串,int为对应的下标
                t[j] = make_pair(nums[j].substr(nSize-trim),j);
            }
            //对vector<pair<string,int>>类型进行排序,这样即可不丢失下标
            //当元素是pair时,vector默认的排序是string比大小
            sort(t.begin(),t.end());
            ans[i] = t[k-1].second;
        }
        return ans;
    }
};

请添加图片描述

第三题

设置文本编辑器

class TextEditor {
public:
    string left, right;

    TextEditor() {
        left = "";
        right = "";
    }
    
    void addText(string text) {
        left += text;
    }
    
    int deleteText(int k) {
        int cnt = 0;
        while (!left.empty() && k > 0) {
            left.pop_back();
            k--;
            cnt++;
        }
        return cnt;
    }
    
    string cursorLeft(int k) {
        while (!left.empty() && k > 0) {
            char ch = left.back();
            left.pop_back();
            right += ch;
            k--;
        }
        if (left.size() <= 10) {
            return left;
        }
        int pos = left.size() - 10;
        return left.substr(pos);
    }
    
    string cursorRight(int k) {
        while (!right.empty() && k > 0) {
            char ch = right.back();
            right.pop_back();
            left += ch;
            k--;
        }
        if (left.size() <= 10) {
            return left;
        }
        int pos = left.size() - 10;
        return left.substr(pos);
    }
};
/**
 * Your TextEditor object will be instantiated and called as such:
 * TextEditor* obj = new TextEditor();
 * obj->addText(text);
 * int param_2 = obj->deleteText(k);
 * string param_3 = obj->cursorLeft(k);
 * string param_4 = obj->cursorRight(k);
 */

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值