zoukankan      html  css  js  c++  java
  • 1417. 重新格式化字符串--来源:力扣(LeetCode)

    题目描述:

    给你一个混合了数字和字母的字符串 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 仅由小写英文字母和/或数字组成。

    结果:

     

    主要思路:

    通过创建两个字节数据,得到可以操作的数据类型,先对副本中数据进行排序,并分别计算数量。

    从副本中获取数据插入对应位置,数量多的一类放在偶数位

     代码:

    class Solution {
        public String reformat(String s) {
    
        //创建字符数组(一个副本)
        char[] chars = new char[s.length()];
        char[] chars2 = new char[s.length()];
        s.getChars(0, s.length(), chars, 0);
        s.getChars(0, s.length(), chars2, 0);
    
        //计数器
        int j = 0;//字母
        int k = 0;//数字
    
        //对对字符数组内部进行排序
        for (int i = 0; i < s.length(); i++) {
            if (chars[i] > 96) {
                chars2[s.length() - j-1] = chars[i];
                j++;
            } else {
                chars2[k] = chars[i];
                k++;
            }
        }
    
        //特殊情况,直接返回""
        if (k == 0 || k == s.length()) {
    
            //比较坑,单个字符返回字符本身
            if (s.length() == 1) {
                return s;
            }
    
            return "";
        }
        System.out.println(Arrays.toString(chars2));
        System.out.println(k);
        System.out.println(j - 1);
    
        /**
         * 对字符进行插入chars操作
         * 根据计数器的大小判断字符的位置
         * 大的在偶数位
         */
        if (j  < k) {
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0) {
                    chars[i] = chars2[i / 2];
                } else {
                    chars[i] = chars2[s.length() - 1 - i / 2];
                }
            }
        } else {
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0) {
                    chars[i] = chars2[s.length() - 1 - i / 2];
                } else {
                    chars[i] = chars2[i / 2];
    
                }
            }
        }
        System.out.println(Arrays.toString(chars));
    
        //输出格式
        StringBuilder sb = new StringBuilder();
        for (char x : chars) {
            sb.append(x);
        }
        return new String(sb);
    }
    }
  • 相关阅读:
    hdu 3342 Legal or Not 拓排序
    hdu 1596 find the safest road Dijkstra
    hdu 1874 畅通工程续 Dijkstra
    poj 2676 sudoku dfs
    poj 2251 BFS
    poj Prime Path BFS
    poj 3278 BFS
    poj 2387 Dijkstra 模板
    poj 3083 DFS 和BFS
    poj 1062 昂贵的聘礼 dijkstra
  • 原文地址:https://www.cnblogs.com/DemonQin/p/12741556.html
Copyright © 2011-2022 走看看