基于visual Studio2013解决面试题之0710求方优化

本文介绍了一种优化的幂运算算法,通过将问题分解为更小的子问题来减少计算次数,从而将时间复杂度从O(n)降低到O(logn)。文章提供了具体的C++实现代码,展示了如何通过递归方式高效计算a^n。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




题目



解决代码及点评

/*
    假设我们求 2^32,指数是 32,那么我们需要进行 32 次循环的乘法。但是我们在求出 2^16
    以后,只需要在它的基础上再平方一次就可以求出结果。同理可以继续分解 2^16。也就是
    a^n=a^(n/2)*a^(n/2),(n 为偶数);或者 a^n=a^((n-1)/2)*a^((n-1)/2)*a,(n 为奇数)。这样就将
    问题的规模大大缩小,从原来的时间复杂度 O(n)降到现在的时间复杂度 O(logn)。可以用递
    归实现这个思路.
*/

#include <iostream>
using namespace std;

/*
	优化的Power函数
*/
double MyPower(double base, unsigned int absExp)
{
    if (absExp == 0)
    {
        return 1;
    }
    if (absExp == 1)
    {
        return base;
    }

    double dblResult = 1.0 * base;
	int i;
	// 对2的n次方部分快速进行
    for (i = 2; i <= absExp; i*=2)
    {
        dblResult *= dblResult;
    }
	// 剩余的部分再一个个乘法
	for (int j = 0; j < absExp - i/2; j++)
	{
		dblResult *= base;
	}

    return dblResult;
}
int main()
{
    cout<<MyPower(2,7)<<endl;
    system("pause");
    return 0;
}


代码下载及其运行

代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519

解压密码:c.itcast.cn


下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:

1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”


2)在下拉框中选择相应项目,项目名和博客编号一致

3)点击“本地Windows调试器”运行


程序运行结果








### 如何在 Visual Studio 中实现回文链表问题 要在 Visual Studio 中实现面试题 02.06 回文链表的解决案,可以按照以下式编写代码并运行程序。以下是基于 C++ 实现的一个完整案。 #### 解决案描述 该问题的核心在于验证单向链表是否为回文结构。可以通过反转链表的一部分并与原链表对比来完成这一目标[^1]。另一种常见法是利用辅助数据结构(如栈),通过存储节点值再逐一比较的解决问题[^4]。 下面是一个完整的 C++ 实现: ```cpp #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; class Solution { public: bool isPalindrome(ListNode* head) { if (head == nullptr || head->next == nullptr) return true; // 找到中间节点 ListNode *slow = head, *fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } // 反转后半部分链表 ListNode *prev = nullptr, *curr = slow, *nextNode = nullptr; while (curr) { nextNode = curr->next; curr->next = prev; prev = curr; curr = nextNode; } // 对比前半部分和反转后的后半部分 ListNode *firstHalf = head, *secondHalf = prev; while (secondHalf) { if (firstHalf->val != secondHalf->val) return false; firstHalf = firstHalf->next; secondHalf = secondHalf->next; } return true; } }; // 辅助函数:创建链表 ListNode* createList(const vector<int>& nums) { if (nums.empty()) return nullptr; ListNode dummy(0); ListNode* tail = &dummy; for (const auto& num : nums) { tail->next = new ListNode(num); tail = tail->next; } return dummy.next; } // 主函数测试 int main() { vector<int> input = {1, 2, 3, 2, 1}; // 测试输入 ListNode* head = createList(input); Solution solution; cout << (solution.isPalindrome(head) ? "True" : "False") << endl; system("pause"); return 0; } ``` #### 关键点解析 1. **寻找中间节点** 使用快慢指针法找到链表的中间位置。`slow` 指针每次移动一步,而 `fast` 每次移动两步。当 `fast` 到达链表末尾时,`slow` 正好位于中间位置。 2. **反转后半部分链表** 将链表的后半部分就地反转以便于后续比较。此过程不需额外空间开销。 3. **逐一对比前后两部分** 比较原始链表的前半部分与反转后的后半部分是否一致。如果存在差异则返回 `false`;否则继续直到结束。 4. **恢复链表(可选)** 如果需要保持原有链表不变,在最后应再次反转后半部分以还原整个链表状态。 --- ####
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值