本文由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.程序是否有其他问题大家还可以考虑下,写程序一定要严谨,大家发现后欢迎留言交流。