编程之美01—返回数组中所有元素与一个元素相除的结果

本文由CC原创总结,如需转载请注明地址:http://blog.csdn.net/oktears/article/details/21382769 。

最近在读《编程之美--微软技术面试心得》这本书,相当不错的一本书,推荐大家阅读。

总结一下书上比较不错的小题目,分享给大家,希望可以增强思维逻辑和算法能力。

题目: 写一个函数,返回一个数组中所有元素被第一个元素除的结果(输出时不能使用临时变量)。

实现代码如下:

//
//  main.cpp
//  Test_01
//
//  Created by cc on 14-3-17.
//  Copyright (c) 2014年 cc. All rights reserved.
//  编程之美:P11 写一个函数,返回一个数组中所有元素被第一个元素除的结果

#include <iostream>

using namespace std;

void divArray(int* pArray, int size);
void divArray2(int* pArray, int size);


int main(int argc, const char * argv[])
{
    int size = 10;
    
    int pArray[10] = {2, 2, 3, 4 , 5, 6, 7, 8, 9, 10};
    
    //divArray(pArray, size);
    divArray2(pArray, size);
    return 0;
}

/**
 *	@brief	正向遍历int数组,打印数组中每个元素与第一个元素的相除的结果
 *
 *	@param 	pArray 	数组
 *	@param 	size 	数组的长度
 */
void divArray(int* pArray, int size){
    
    for (int i = 0; i < size; i++) {
        pArray[i] /= pArray[0];
        cout << "divArray_result=" << pArray[i] << " ";
    }
    cout << endl;
}


/**
 *	@brief	反向遍历int数组,打印数组中每个元素与第一个元素的相除的结果
 *
 *	@param 	pArray 	数组
 *	@param 	size 	数组的长度
 */
void divArray2(int* pArray, int size){
    for (int i = size-1; i >= 0; i--) {
        pArray[i] /= pArray[0];
        cout << "divArray2_result=" <<  pArray[i] << " ";
    }
    cout << endl;
}<span style="color:#ff6666;">
</span>


题目很简单,大家都可以想到用一个循环来实现,分别打印出数组的每一个元素与第一个元素的商。

题目要求不能使用临时变量来保存输出的数据,所以就用pArray[i] /= pArray[0]这种形式进行输出了。

但是这样做会出现问题,当我们使用正向遍历的时候,当i=0时,因为是自己除以自己,所以第一次运算的结果会为1,此时pArray[i]也就是pArray[0]会被重新赋值为1,因此后面再进行遍历输出的时候,输出的结果都会是本身了,因为pArray[0]已经非初值了,而是1。大家可以通过divArray这个函数来看以下打印的结果。

那么这个问题该如何解决呢?

可以通过反向遍历来解决,反向遍历数组靠后的元素虽然也会被重新赋值,但是只使用一次,就不会再用到了,而pArray[0]的值一直没有被改变,直到最后一次遍历的时候才会被重新赋值,这种方式遍历不会影响到输出的结果,divArray2函数即实现了题目的输出要求。

程序其实还是有很多问题的,这些问题都是大家平时容易犯的错误,大家可以完善一下。

1.如果给定的数组里面的内容部是写死的, 我们并不知道数组里保存的值,那么我们就必须检测pArray[0]是否为0的情况,如果为0是不能被除的。

2.如果题目没有给定要求输出时不能使用临时变量,那么我们尽量把数组定义成const,避免数组的元素数值被改变引起错误。

3.程序是否有其他问题大家还可以考虑下,写程序一定要严谨,大家发现后欢迎留言交流。

你可能感兴趣的:(C++,算法,面试,编程之美,数组遍历)