Java&LeetCode 初入门——038. 报数

Java&LeetCode 初入门——038. 报数

文内代码全部采用JAVA语言。

题目

在这里插入图片描述

测试用例
示例 1:

输入: 1
输出: "1"

示例 2:

输入: 4
输出: "1211"

个人解法

评论区好多小伙伴都说看不懂题目,但是感觉leedcode官方可能对题目重新进行了修改,个人觉得很好理解。就是几个几这样直接向后读,不再过多解释。

个人解法嵌套了两层循环,一层是序列n,一层是字符串中的字符。
下一个序列需要读上一个序列的字符串。比如n=6时,就读n=5的“111221”这个序列,读作:3个1,2个2,1个1,写成字符串就是“312211”。
循环啥的都是次要的,主要是读数,首先字符串转换成字符数组。然后双指针,记录数字和个数(类比026和037,区别在于不需要覆盖元素,只要统计个数)。个人觉得还是比较好理解,就是写起来比较麻烦,因为最末位与前面相同的情况以及n=1都是要特殊考虑。目前没有想到改进算法的办法。

代码如下,速度不忍直视。执行用时: 37 ms, 在Count and Say的Java提交中击败了24.05% 的用户。
不过学习了一下,发现如果将String全部改成StringBuffer就会大幅增进代码运行效率,试了一下,眼珠子都要掉出来。执行用时: 5 ms, 在Count and Say的Java提交中击败了77.34% 的用户。一样的流程,只是字符类型小小变换了一下,差距这么大。

public String countAndSay(int n) {
		String ansbef="1";
		String ans = null;
		if (n==1) {
			return ansbef;
		}
		for (int i = 0; i < n-1; i++) {
			ans="";
			char[] anschar=ansbef.toCharArray();
//			System.out.println(anschar);
			int k=0;
			int j=0;
			int times=0;
			while (j<anschar.length) {
				if (anschar[j]!=anschar[k] ) {
					ans=ans+times+anschar[k];
					times=0;
					k=j;
					continue;
				}else if(anschar[j]==anschar[k] && j==anschar.length-1){
					times++;
					j++;
					ans=ans+times+anschar[k];
				}else {
					times++;
					j++;
				}
			}
			ansbef=ans;
//			System.out.println(ansbef);
			
		}
		return ans;

	}

StringBuffer改进后

class Solution {
	public String countAndSay(int n) {
		StringBuffer ansbef=new StringBuffer("1");
		StringBuffer ans = new StringBuffer("");
		if (n==1) {
			return ansbef.toString();
		}
		for (int i = 0; i < n-1; i++) {
			ans=new StringBuffer("");
			char[] anschar=ansbef.toString().toCharArray();
//			System.out.println(anschar);
			int k=0;
			int j=0;
			int times=0;
			while (j<anschar.length) {
				if (anschar[j]!=anschar[k] ) {
					ans=ans.append(times).append(anschar[k]);
					times=0;
					k=j;
					continue;
				}else if(anschar[j]==anschar[k] && j==anschar.length-1){
					times++;
					j++;
					ans=ans.append(times).append(anschar[k]);
				}else {
					times++;
					j++;
				}
			}
			ansbef=ans;
//			System.out.println(ansbef);
			
		}
		return ans.toString();

	}
	
}

奇葩解法

本题未给出官方解法。最快的代码只需要1ms,但是真的看哭我,直接遍历有限的测试用例。这么长的字符串,也不知道是哪位大神为了追求全灭复制粘贴的答案。
=图2=
撇开这个不谈,范例里还是有正常解法的。
但是大同小异吧,没有具体看,但是快的一般都没有直接用String。String太慢了!!

猜你喜欢

转载自blog.csdn.net/qq_27480345/article/details/86089741
今日推荐