脚撕LeetCode(1417)Easy
Posted JathonKatu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了脚撕LeetCode(1417)Easy相关的知识,希望对你有一定的参考价值。
给你一个混合了数字和字母的字符串 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 仅由小写英文字母和/或数字组成。
一、爆破法
首先遍历统计一下字符和数字的个数,如果差值超过1则说明不能生成(因为数字和字符不能挨着,所以数组长度为双数的时候差值为0,数组长度为单数的时候差值为1)
然后,将数量少的设置成1,数量多的设置成0,一样的话就无所谓(所以一样的情况不单独处理)
然后隔一个放一个数字或者字符,所以步长是2,不断地循环步长直到指向数字的指针并不是指向数字,指向字符的指针并不是指向字符,然后交换。
执行结果如下:
301 / 301 个通过测试用例
状态:通过
执行用时: 2 ms
内存消耗: 38.4 MB
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
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
以上是关于脚撕LeetCode(1417)Easy的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode: 136 Single Number(easy)
LeetCode之Easy篇 ——(13)Roman to Integer