• 入门力扣自学笔记120 C++ (题目编号1417)


    1417. 重新格式化字符串

    题目:

    给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

    请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

    请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。


    示例 1:

    输入:s = "a0b1c2"
    输出:"0a1b2c"
    解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。


    示例 2:

    输入:s = "leetcode"
    输出:""
    解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。


    示例 3:

    输入:s = "1229857369"
    输出:""
    解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。


    示例 4:

    输入:s = "covid2019"
    输出:"c2o0v1i9d"


    示例 5:

    输入:s = "ab123"
    输出:"1a2b3"


    提示:

    1 <= s.length <= 500
    s 仅由小写英文字母和/或数字组成。


    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/reformat-the-string
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    思路:

    1.顺序扫一遍,尽可能交错填充ans

    2.扫描过程中没能填入ans,分别记录到nums和chars

    3.扫描结束后,分别从nums和chars取出,插入ans。


    代码:

    1. class Solution {
    2. public:
    3. string reformat(string s) {
    4. string ans;
    5. string nums, chars;
    6. for(char c: s){
    7. if(isdigit(c)){
    8. if(ans.empty() || isalpha(ans[ans.size()-1])){
    9. ans.push_back(c);
    10. } else{
    11. nums.push_back(c);
    12. }
    13. } else{
    14. if(ans.empty() || isdigit(ans[ans.size()-1])){
    15. ans.push_back(c);
    16. } else{
    17. chars.push_back(c);
    18. }
    19. }
    20. }
    21. // cout << nums.size() << " " << chars.size() << " " << fabs(nums.size() - chars.size());
    22. if(fabs((int)nums.size() - (int)chars.size()) > 1) return "";
    23. int size = min(nums.size(), chars.size());
    24. bool is_digit = isdigit(ans[ans.size()-1]);
    25. for(int i=0;i
    26. if(is_digit){
    27. ans.push_back(chars[i]);
    28. ans.push_back(nums[i]);
    29. } else{
    30. ans.push_back(nums[i]);
    31. ans.push_back(chars[i]);
    32. }
    33. }
    34. if(nums.size() - size == 1){
    35. if(isdigit(ans[0]) && isdigit(ans[ans.size()-1])) return "";
    36. else if(isdigit(ans[0])) return ans + nums[size];
    37. else return nums[size] + ans;
    38. } else if(chars.size() - size == 1){
    39. if(isalpha(ans[0]) && isalpha(ans[ans.size()-1])) return "";
    40. else if(isalpha(ans[0])) return ans + chars[size];
    41. else return chars[size] + ans;
    42. }
    43. return ans;
    44. }
    45. };

  • 相关阅读:
    【一周聚焦】 联邦学习 arxiv 2.16-3.10
    rmq集群同步复制、异步复制
    SQL注入漏洞发现和利用,以及SQL注入的防护
    19.0、C语言——指针笔试面试题
    关于Flask高级_WTF自定义验证器的方法
    c库函数:strrchr使用demo案例
    中秋快乐! Happy Mid-autumn Festival!
    正点原子嵌入式linux驱动开发——TF-A初探
    10:00面试,10:08就出来了,问的问题有点变态。。。
    uboot启动linux kernel的流程
  • 原文地址:https://blog.csdn.net/DK_Sorhic/article/details/126280878