2. 尾部的零
题目来源:LintCode
题目:
设计一个算法, 计算出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
题目:
合并两个排序的整数数组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
题目:
给定一个字符串和一个偏移量, 根据偏移量旋转字符串(从左向右旋转)
样例
对于字符串 "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
题目:
给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:
- 如果这个数被3整除,打印
fizz
. - 如果这个数被5整除,打印
buzz
. - 如果这个数能同时被
3
和5
整除,打印fizz buzz
.
样例
比如 n = 15
, 返回一个字符串数组:
[
"1", "2", "fizz",
"4", "buzz", "fizz",
"7", "8", "fizz",
"buzz", "11", "fizz",
"13", "14", "fizz buzz"
]
难度级别:
容易
容易
使用的编程语言:
C++
思路分析:
刚开始利用的是 C中的指针数组, 后来发现Compile错误, 结果审查发现
题意给出返回值为 vector<string>类型, C++的STL中的vector就像平常使用的数组一样,
可以理解为是能连续存储任意类型的"容器".
需要include一个 vector 头文件才可以使用.
#include <vector>
这里我使用了 vec.push_back(); --在末尾添加元素的方法,但是当我要把正常的数字填进去的时候,
发现不能将变量代表的具体数字放进去, 结果发现 sprintf函数可以解决这个问题.
sprintf是字符串格式化命令, 主要功能是将格式化的数据写入某个字符串中.
所以利用sprintf, 我成功将变量背后的数字转换成字符串, 从而可以存入vector当中.
实现代码:
class Solution {
public:
/*
* @param n: An integer
* @return: A list of strings.
*/
vector<string> fizzBuzz(int n) {
char* temp = new char[10];
vector<string> 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;
}
};