剑指offer面试题汇总(高质量的代码)

@TOC
输入参数的检查、处理错误和异常方式、命名方式

功能测试、边界测试、负面测试

面试题16:数值的整数次方

实现函数:double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

我的想法就是一直循环相乘 = =

切记要考虑exponent小于1的情况啊!
那exponent=负数base为0呢?

bool g_InvalidInput = false;

double Power(double base, int exponent)
{
    g_InvalidInput = false;
    if(equal(base, 0.0) && exponent<0)
    {
        g_InvalidInput = true;
        return 0.0;
    }
    
    unsigned int absExponent = (unsigned int)(exponent);
    
    if(exponent<0)  absExponent = (unsigned int)(-exponent);
    double result = PowerWithUnsignedExponent(base, absExponent);
    if(exponent<0)  result = 1.0/result;
    return result;
}

double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    double result = 1.0;
    for(int i=1; i<=exponent; i++)
        result * = base;
    
    return result;
}

来了,高效的方法来了!

    if(exponent ==0)
        return 1;
    if(exponent==1)
        return base;
    double result = PowerWithUnsignedEponent(base, exponent>>1);
    result * = result;
    if(exponent & ix1 == 1) result*=base;
    
    return result;

用右移代替除以2,与代替检验奇偶,提高运算的效率

面试题17:打印从1到最大的n位数

输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3直到最大的3位数999;

大数怎么办??超过int、long long会溢出

解法一

利用字符串表示。定义一个长度为n+1的字符串,不足n位时前面补0。模拟整数加法

void Print1ToMaxOfDigits(int n)
{
    if(n<=0)    return;
    char *number = new char[n+1];
    memset(number, '0', n);
    number[n]='\0';
    
    while(!Increment(number))
    {
        PrintNumber(number);
    }
    
    delete [] number;
    
}

上述代码先初始化一个长度为n+1的字符串,注意是n+1

bool Increment(char *number)
{
    bool isOverflow = false;
    int nTakeOver = 0;
    int nLength = strlen(number);
    
    for(int i=nLength-1; i>=0; i--)
    {
        int nSum = number[i] - '0' + nTakeOver;
        
        if(i == nLength -1)
        {
            nSum ++;
        }
        
        if(nSum > 10)
        {
            if(i==0) isOverflow = true;
            else
            {
                nSum -= 10;
                nTakeOver = 1;
                number[i] = '0' + nSum;
                
            }
        }
        else
        {
            number[i] = nSum + '0';
            break;
        }
    }
    return isOverflow;
}

要注意判断是不是会产生进位


void PrintNumber(char * number)
{
    bool isBeginning0 = true;
    int nLength = strlen(number);
    
    for(int i=0; i

print的时候要注意其书写习惯。

memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作

解法二:数字排列

n位所有的十进制数其实是n个从0到9的全排列,打印的时候,将高位的0不要打印出来即可。

void Print1ToMaxOfNDigitsRecursively(char *number, int length, int index)
{
	if(index == length -1)
	{
		PrintNumber(number);
		return;
	}
	for(int i=0; i<10; i++)
	{
		number[index + 1] = i+'0';
		Print1ToMaxOfNDigitsRecursively(number, length, index+1);
	}
}

void Print1ToMax(int n)
{
	if(n<=0)	return;
	char *number = new char[n+1];
	number[n] = '\0';

	for(int i=0; i<10;i++)
	{
		number[0] = i+'0';
		Print1ToMaxOfNDigitsRecursively(number, n, 0);
	}
	delete [] number;
}

你可能感兴趣的:(leetcode,算法)