编程之美01—回到数组中所有元素与第一个元素相除的结果
本文由CC原创总结,如需转载请注明地址:http://blog.****.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;
}
题目很简单,大家都可以想到用一个循环来实现,分别打印出数组的每一个元素与第一个元素的商。
题目要求不能使用临时变量来保存输出的数据,所以就用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.程序是否有其他问题大家还可以考虑下,写程序一定要严谨,大家发现后欢迎留言交流。