备战程序设计大赛-LintCode刷题记录(二)

2. 尾部的零


题目来源:LintCode

原题地址: http://www.lintcode.com/zh-cn/problem/trailing-zeros/

题目:
设计一个算法, 计算出n阶乘中尾部零的个数.

样例
11! = 39916800
所以应返回2
难度级别:
容易

使用的编程语言:
C++

思路分析:
N!中0的个数 = 5的倍数 + 5^2的倍数 + 5^3的倍数 + 5^5的倍数...
实现代码:
class Solution {
public:
    /*
     * @param n: A long integer
     * @return: An integer, denote the number of trailing zeros in n!
     */
    long long trailingZeros(long long n) 
    {
        long counter = 0;
        for (long i = 5; n / i >= 1; i *= 5)
        {
            counter += n / i;
        }
        return counter;
    }
};


6. 合并排序数组(II)


题目来源:LintCode

原题地址: http://www.lintcode.com/zh-cn/problem/trailing-zeros/

题目:
合并两个排序的整数数组A和B变成一个新的数组.

样例
给出 A=[1,2,3,4], B=[2,4,5,6]
返回 [1,2,2,3,4,4,5,6]

难度级别:
容易

使用的编程语言:
Java

思路分析:
将A和B使用System类中的arraycopy方法, 将A和B两个数组进行连接, 最终形成C数组.
最后调用Arrays.sort方法对C数组进行升序排序.
实现代码:
public class Solution {
    /*
     * @param A: sorted integer array A
     * @param B: sorted integer array B
     * @return: A new sorted integer array
     */
    public int[] mergeSortedArray(int[] A, int[] B) {
        int len = A.length + B.length;
        int[] C = new int[len];
        System.arraycopy(A, 0, C, 0, A.length);
        System.arraycopy(B, 0, C, A.length, B.length);
        Arrays.sort(C);
        return C;
    }
}


8. 旋转字符串


题目来源:LintCode

原题地址: http://www.lintcode.com/zh-cn/problem/rotate-string/

题目:
给定一个字符串和一个偏移量, 根据偏移量旋转字符串(从左向右旋转)

样例
对于字符串 "abcdefg"
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"

难度级别:
容易

使用的编程语言:
C++

思路分析:
我先以 abcdefg串为例, 发现所谓的"旋转"其实就是将两个字符串按照某个索引进行切断之后, 
再反过来拼接.
假如偏移量是3, 设这个串长为len, 那么就把0~len-offset的字符截取下来(abcd)放到串A上
把len-offset~len的字符截取下来(efg)放到串B上
最终连接BA串(string C = B+A)
实现代码:
class Solution {
public:
    /*
     * @param str: An array of char
     * @param offset: An integer
     * @return: nothing
     */
    void rotateString(string &str, int offset) {
        int len = str.length();
        if(offset == 0 || len == 0)
        {
            return; //考虑空串情况
        }
        if(offset >= len);
        {
            offset = offset%len; //考虑给出的偏移量大于或等于长度的情况
        }
        string b = str.substr(len-offset);
        string c = str.substr(0, len-offset);
        str = b + c;
    }
};

9. Fizz Buzz问题


题目来源:LintCode

原题地址: http://www.lintcode.com/zh-cn/problem/fizz-buzz/

题目:

给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:

  • 如果这个数被3整除,打印fizz.
  • 如果这个数被5整除,打印buzz.
  • 如果这个数能同时被35整除,打印fizz buzz.


样例

比如 n = 15, 返回一个字符串数组:

[
  "1", "2", "fizz",
  "4", "buzz", "fizz",
  "7", "8", "fizz",
  "buzz", "11", "fizz",
  "13", "14", "fizz buzz"
]

难度级别:
容易

使用的编程语言:
C++

思路分析:
刚开始利用的是 C中的指针数组, 后来发现Compile错误, 结果审查发现
题意给出返回值为 vector类型, C++的STL中的vector就像平常使用的数组一样,
可以理解为是能连续存储任意类型的"容器".
需要include一个 vector 头文件才可以使用.
#include
这里我使用了 vec.push_back();  --在末尾添加元素的方法,但是当我要把正常的数字填进去的时候,
发现不能将变量代表的具体数字放进去, 结果发现 sprintf函数可以解决这个问题.
sprintf是字符串格式化命令, 主要功能是将格式化的数据写入某个字符串中.
所以利用sprintf, 我成功将变量背后的数字转换成字符串, 从而可以存入vector当中.

实现代码:
class Solution {
public:
    /*
     * @param n: An integer
     * @return: A list of strings.
     */
    vector fizzBuzz(int n) {
        char* temp = new char[10];
	    vector vec;
    	for(int i = 0; i < n; i++)
    	{
    		int k = i+1;
    		if(k%3 == 0 && k%15 != 0)
    		{
    			vec.push_back("fizz"); 
    		}
    		else if(k%5 == 0 && k%15 != 0)
    		{
    			vec.push_back("buzz"); 
    		}
    		else if(k%15 == 0)
    		{
    			vec.push_back("fizz buzz"); 
    		}
    		else
    		{
    			sprintf(temp, "%d", i+1);	
    			vec.push_back(temp);
    		}
    	}
    	return vec;
    }
};



你可能感兴趣的:(ACM)