`
wdp107
  • 浏览: 144383 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

程序员面试题精选(08)-求1+2+...+n

阅读更多
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。
通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。
我们仍然围绕循环做文章。循环只是让相同的代码执行n遍而已,我们完全可以不用for和while达到这个效果。比如定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。我们可以将需要执行的代码放到构造函数里。如下代码正是基于这个思路:
class Temp
{
public:
       Temp() { ++ N; Sum += N; }
      static void Reset() { N = 0; Sum = 0; }
      static int GetSum() { return Sum; }
private:
      static int N;
      static int Sum;
};

int Temp::N = 0;
int Temp::Sum = 0;
int solution1_Sum(int n)
{
       Temp::Reset();

       Temp *a = new Temp[n];
      delete []a;
       a = 0;

       return Temp::GetSum();
}

我们同样也可以围绕递归做文章。既然不能判断是不是应该终止递归,我们不妨定义两个函数。一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在两个函数里二选一。从二选一我们很自然的想到布尔变量,比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。那现在的问题是如和把数值变量n转换成布尔值。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。有了上述分析,我们再来看下面的代码:
class A;
A* Array[2];

class A
{
public:
      virtual int Sum (int n) { return 0; }
};
class B: public A
{
public:
      virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }
};
int solution2_Sum(int n)
{
       A a;
       B b;
       Array[0] = &a;
       Array[1] = &b;

      int value = Array[1]->Sum(n);
      return value;
}

这种方法是用虚函数来实现函数的选择。当n不为零时,执行函数B::Sum;当n为0时,执行A::Sum。我们也可以直接用函数指针数组,这样可能还更直接一些:
typedef int (*fun)(int);
int solution3_f1(int i) 
{
      return 0;
}
int solution3_f2(int i)
{
       fun f[2]={solution3_f1, solution3_f2}; 
      return i+f[!!i](i-1);
}

另外我们还可以让编译器帮我们来完成类似于递归的运算,比如如下代码:
template <int n> struct solution4_Sum
{
      enum Value { N = solution4_Sum<n - 1>::N + n};
};

template <> struct solution4_Sum<1>
{
      enum Value { N = 1};
};

solution4_Sum<100>::N就是1+2+...+100的结果。当编译器看到solution4_Sum<100>时,就是为模板类solution4_Sum以参数100生成该类型的代码。但以100为参数的类型需要得到以99为参数的类型,因为solution4_Sum<100>::N=solution4_Sum<99>::N+100。这个过程会递归一直到参数为1的类型,由于该类型已经显式定义,编译器无需生成,递归编译到此结束。由于这个过程是在编译过程中完成的,因此要求输入n必须是在编译期间就能确定,不能动态输入。这是该方法最大的缺点。而且编译器对递归编译代码的递归深度是有限制的,也就是要求n不能太大。
分享到:
评论

相关推荐

    程序员面试题精选100题.doc

    对于程序员面试,理解并能熟练应用这类问题的解决方案,展示了解数据结构和算法的能力,是评估应聘者编程技能的重要标准。同时,能清晰解释和分析递归过程,也是考察逻辑思维和问题解决能力的关键。

    程序员面试题精选(1-57)

    本资源"程序员面试题精选(1-57)"显然是一个汇集了众多面试题目的集合,涵盖了从基础到高级的各种问题,旨在帮助求职者提升自己的技能并顺利通过面试。 首先,我们要理解数据结构的重要性。数据结构是组织和存储数据...

    程序员面试题精选-输出一个字符串的所有子串

    在程序员的面试中,字符串操作是一项常见的考察点。本题目的核心是输出一个给定字符串的所有子串,这里我们以字符串 "abc" 为例来详细讲解解题思路和方法。 首先,我们需要理解子字符串的概念。在字符串 "abc" 中,...

    前端程序员面试分类模拟题--附答案详解

    【前端程序员面试分类模拟题及答案详解】 面试是评估求职者技能的重要环节,尤其是对于前端程序员来说,了解HTML、CSS、JavaScript以及网络协议等相关知识至关重要。以下是对题目中涉及的知识点的详细解释: 1. ...

    1000道Java 程序员必备面试题-V1版.pdf

    Java 程序员必备面试题-V1版.pdf 本资源是一个 Java 面试题集,涵盖了 Java 基础、集合、并发、MySQL、Kafka 等高频知识点。下面是对标题和描述中所说的知识点的详细说明: 动态代理 在 Java 中,动态代理可以...

    asp.net初级程序员面试题

    ASP.NET 初级程序员面试题涉及了多个核心概念和技术,以下是对这些知识点的详细解析: 1. 访问修饰符:`private`、`protected`、`public`、`internal`是C#中的访问控制修饰符,它们决定了类成员的可见性。 - `...

    程序员面试题精选100题(自己整理)

    【知识点详解】 1. **二元查找树(Binary Search ... 这类问题通常出现在程序员的面试中,因为它测试了对数据结构的理解、递归思维以及解决问题的能力。理解和掌握这个问题的解法对于提升编程技巧和面试表现至关重要。

    Java程序员面试分类真题带解析.docx

    12. 完全二叉树第i层的最后一个节点编号为2^(i-1)-1,100个节点的完全二叉树第2层最后一个节点编号为2^1-1=1,所以第3层的第一个节点编号是2,所以编号最小的叶子节点是2^(i-2)+1=2^1=2,答案是B。 13-20题涉及...

    程序员面试题集锦

    【程序员面试题集锦】是针对IT行业,尤其是Java编程方向的面试者精心整理的一份资源,涵盖了各大公司的面试题目以及数据结构相关的知识点。这份资料旨在帮助应聘者全面准备面试,提升自己的技术水平和应试能力。 一...

    程序员面试题精选100例.doc

    - 输入数组:`[4, 1, 2, 1, 2]` - 输出:`[4]` - **解题思路**: - 使用异或运算来解决。 - 对整个数组进行异或运算,得到的结果是两个唯一数字的异或结果。 - 找出异或结果中的任意一个为1的位,作为区分位。...

    程序员面试题精选63题

    在程序员面试中,数据结构和算法是经常被考察的重要领域,尤其是涉及到二元查找树(Binary Search Tree, BST)的问题。本题目的核心是将一个二元查找树转换成一个排序的双向链表,这涉及到对树结构的深入理解和递归...

    Java程序员面试题大全

    【Java程序员面试题详解】 1. 数据库操作: - 创建表A时,要设置m字段为唯一(UNIQUE)且非空(NOT NULL),n字段初始值为0,m、n、y字段不可为空(NOT NULL)。 - 修改表A的n字段初始值,可以通过ALTER TABLE...

    2022年最新ASPNET程序员面试试题及答案.doc

    斐波那契数列定义为F(n) = F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1。递归实现如下: ```csharp public static int Fibonacci(int n) { if (n &lt;= 1) return n; else return Fibonacci(n - 1) + Fibonacci(n - ...

    大型公司程序员面试题

    在大型公司的程序员面试中,考察的知识点广泛而深入,涵盖了数据结构、算法、数据库操作、编程语言特性以及软件设计等多个方面。以下是对这些面试题的详细解析: 1. **斐波那契数列**:这是一个典型的递归问题,...

    常见:程序员面试题精选100题1

    总结,这个面试题涉及了二元查找树、双向链表和递归等核心计算机科学概念。掌握这些知识点对于准备程序员面试至关重要,尤其是对于那些需要处理复杂数据结构和算法的问题。通过深入理解和实践,可以提高解决问题的...

    程序员面试100题数据结构和算法

    8. **等差数列求和**:求1到n的等差数列和,可以使用高斯求和公式n*(n+1)/2。 9. **链表倒数第k个节点**:找到链表的倒数第k个节点。双指针法,一个指针先移动k步,然后两个指针一起移动,当先移动的指针到达链表...

Global site tag (gtag.js) - Google Analytics