前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >脚撕LeetCode(1417)Easy

脚撕LeetCode(1417)Easy

作者头像
JathonKatu
发布2022-01-18 08:13:06
970
发布2022-01-18 08:13:06
举报
文章被收录于专栏:JathonKatu

题目地址:https://leetcode-cn.com/problems/reformat-the-string/

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。

代码语言:javascript
复制
示例 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 仅由小写英文字母和/或数字组成。

一、爆破法

首先遍历统计一下字符和数字的个数,如果差值超过1则说明不能生成(因为数字和字符不能挨着,所以数组长度为双数的时候差值为0,数组长度为单数的时候差值为1)

然后,将数量少的设置成1,数量多的设置成0,一样的话就无所谓(所以一样的情况不单独处理)

然后隔一个放一个数字或者字符,所以步长是2,不断地循环步长直到指向数字的指针并不是指向数字,指向字符的指针并不是指向字符,然后交换。

执行结果如下:

301 / 301 个通过测试用例

状态:通过

执行用时: 2 ms

内存消耗: 38.4 MB

代码语言:javascript
复制
public String reformatMe(String s) {
    int letter = 0;
    int num = 0;
    char[] ans = s.toCharArray();
    int len = ans.length;
    for (int i = 0; i < len; i++) {
        if (isNum(ans[i])) {
            num++;
        } else {
            letter++;
        }
    }
    // 合理情况下,如果是数组length是奇数,则差值是1,如果是偶数,则差值是0
    // 如果抑或=len 则全是某一种,如果抑或不为1,则某种多于另一种多于一个,不符合要求
    if (Math.abs(letter - num) > 1) {
        return "";
    }
    if(letter > num){
        letter = 0;
        num = 1;
    } else {
        letter = 1;
        num = 0;
    }
    char temp;
    while (letter < len && num < len) {
        while(letter < len && !isNum(ans[letter])) letter+=2;
        while(num < len && isNum(ans[num])) num+=2;
        if(letter < len && num < len) {
            temp = ans[letter];
            ans[letter] = ans[num];
            ans[num] = temp;
        }
    }
    return new String(ans);
}
public boolean isNum(char a) {
    return a >='0' && a <= '9';
}

我发现最近我越来越喜欢用while中嵌套两个while作为双指针法了。

而且不知道为什么今天拿不到双百,用评论区的方法去执行基本也会比评论区大佬的执行结果差一些。。奇了怪

二、评论区大佬法

执行结果如下:

301 / 301 个通过测试用例

状态:通过

执行用时: 2 ms

内存消耗: 38.6 MB

代码语言:javascript
复制
public String reformat(String s) {
        int num1=0,num2=0;
        char[] chars = s.toCharArray();
        for(char c:chars){
            if(c >= '0'&&c <= '9'){num1++;}
            else{num2++;}
        }//看数字字符比较多还是字母字符比较多
        if( num1-num2<-1 || num1-num2>1){return "";}
        if(num1>num2){
            num1 = 0;num2 = 1;
        }else{
            num1 = 1;num2 = 0;
        }
        for(char c:s.toCharArray()){
            if(c >= '0'&&c <= '9'){chars[num1] = c; num1 += 2;}
            else{chars[num2] = c; num2 += 2;}
        }
        return new String(chars);
    }

也很简单,只是不同的是,他会循环string来给返回的char赋值,而不是用循环char数组然后对比替换。

两种做法各有优劣,时间空间上没什么区别。next

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JathonKatu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档