LeetCode:Count and Say

1、题目名称

Count and Say(按照数字重复出现计数并生成字符串)

2、题目地址

https://leetcode.com/problems/count-and-say/

3、题目内容

英文:The count-and-say sequence is the sequence of integers beginning as follows

中文:给出正整数n,返回“count-and-say”序列的第n项

说明:

count-and-say序列形如:1, 11, 21, 1211, 111221, ...

1 被读作“1个1”(11)

11 被读作“2个1”(21)

21 被读作“1个2,1个1”(1211)

现在给出一个正整数n,生成序列的第n项

4、解题方法1

这道题用最原始的方法通过循环解决就可以了。

/**
 * 功能说明:LeetCode 38 - Count and Say
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月7日
 */
public class Solution {
    
    /**
     * 按照数字重复出现计数并生成字符串
     * @param n 输入整数
     * @return
     */
    public String countAndSay(int n) {

        if (n <= 1) {
            return "1";
        }
        
        String result = "1";
        String temp;
        char curChar = ‘ ‘;
        int counter = 1;
        
        while (--n != 0) {
            temp = "";

            //计数
            curChar = ‘ ‘;
            counter = 1;
            for (int i = 0; i < result.length(); i++) {
                if (curChar == result.charAt(i)) {
                    counter++;
                } else {
                    if (curChar != ‘ ‘) {
                        temp += String.valueOf(counter);
                        temp += String.valueOf(curChar);
                    }
                    curChar = result.charAt(i);
                    counter = 1;
                }
            }
            temp += String.valueOf(counter);
            temp += String.valueOf(curChar);

            result = temp;
        }
        
        return result;
    }
}

5、解题方法2

这是我之前采用的一种比较笨的方法,每次求下一项都调用一次函数。

import java.util.ArrayList;

/**
 * 功能说明:LeetCode 38 - Count and Say
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月7日
 */
public class Solution {
    
    /**
     * 按照数字重复出现计数并生成字符串
     * @param n 输入整数
     * @return
     */
    public String countAndSay(int n) {

        if (n <= 1) {
            return "1";
        }
        
        String result = "1";
        while (--n != 0) {
            result = getNext(result);
        }
        
        return result;
    }
    
    /**
     * 给定字符串获取下一个字符串
     * @param input 输入
     * @return
     */
    private String getNext(String input) {

        ArrayList<String> arrayList = new ArrayList<String>();
        
        //计数
        char curChar = ‘ ‘;
        int counter = 1;
        for (char ch : input.toCharArray()) {
            if (curChar == ch) {
                counter++;
            } else {
                if (curChar != ‘ ‘) {
                    arrayList.add(String.valueOf(counter) + String.valueOf(curChar));
                }
                curChar = ch;
                counter = 1;
            }
        }
        arrayList.add(String.valueOf(counter) + String.valueOf(curChar));
        
        //拼接字符串
        StringBuilder stringBuilder = new StringBuilder();
        for (String s : arrayList) {
            stringBuilder.append(s);
        }
        
        return stringBuilder.toString();
    }    
}

END

时间: 2024-12-28 02:15:15

LeetCode:Count and Say的相关文章

LeetCode:Count Primes - 统计质数数量

1.题目名称 Count Primes(统计质数数量) 2.题目地址 https://leetcode.com/problems/count-primes/ 3.题目内容 英文:Count the number of prime numbers less than a non-negative number, n. 中文:统计正整数n以内(不含n本身)质数的数量 4.一个TLE的方法 从1到n,考察每个数字是否为质数.这个方法由于花费时间较长,不能满足题目中对时间的要求. 一段实现此方法的Jav

leetcode:Count Primes

Description:Count the number of prime numbers less than a non-negative number, n. 本题给定一个非负数n,让我们求小于n的质数的个数,解题方法就在第二个提示埃拉托斯特尼筛法Sieve of Eratosthenes中,这个算法的过程如下图所示,我们从2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个质数3,标记其所有倍数,一次类推,直到根号n,此时数组中未被标记的数字就是质数.我们需

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

Leetcode problem-204 Count Primes 题解

Leetcode problem-204 Count Primes Count the number of prime numbers less than a non-negative number, n. 题解:这道题如果对每个小于n的数都进行判断是否为素数并计数会超时,因此采用筛法来解这题.建一个数组,从2开始, 把其倍数小于N的都删掉. class Solution { public: int countPrimes(int n) { vector<int>arr(n,1); int s

LeetCode:Combinations 题解

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n = 4 and k = 2, a solution is: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]DFS,递归 1 class Solution { 2 public: 3 vector<vector<int> > an

[LeetCode] 038. Count and Say (Easy) (C++/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 038. Count and Say (Easy) 链接: 题目:https://leetcode.com/problems/Count-and-Say/ 代码(github):https://github.com/illuz/leetcode 题意: 数数,第一个是 1,第二个是数前一个数:1 个 1,就是 11

LeetCode:分发饼干【455】

LeetCode:分发饼干[455] 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ,都有一个尺寸 sj .如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足.你的目标是尽可能满足越多数量的孩子,并输出这个最大数值. 注意: 你可以假设胃口值为正.一个小朋友最多只能拥有一块饼干. 示例 1: 输入: [1,2,3

LeetCode:最少移动次数使得数组元素相等||【462】

LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2,3] 输出: 2 说明: 只有两个动作是必要的(记得每一步仅可使其中一个元素加1或减1): [1,2,3] => [2,2,3] => [2,2,2] 题目分析 一个直观的理解是这样的,如果我们只有两个数字的话,那么我们使得他们变成相等元素的最少步数是多

LeetCode:乘法表中的第K小的数【668】

LeetCode:乘法表中的第K小的数[668] 题目描述 几乎每一个人都用 乘法表.但是你能在乘法表中快速找到第k小的数字吗? 给定高度m .宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字. 例 1: 输入: m = 3, n = 3, k = 5 输出: 3 解释: 乘法表: 1 2 3 2 4 6 3 6 9 第5小的数字是 3 (1, 2, 2, 3, 3). 例 2: 输入: m = 2, n = 3, k = 6 输出: 6 解释: 乘法表: 1 2