脚撕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 

仅由小写英文字母和/或数字组成。


一、爆破法

    首先遍历统计一下字符和数字的个数,如果差值超过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题解....ing python

LeetCode: 136 Single Number(easy)

LeetCode之Easy篇 ——(13)Roman to Integer

leetcode451 汉明距离(Easy)

LeetCode 35. Search Insert Position (Easy)

leetcode118 罗辉三角(Easy)