在不申请新内存空间条件下交换两个数的值

只是觉得这个问题很好玩,在此记录一下:


下面使用编程语言中的‘^’,即异或操作符来完成异或运算,如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

第一次

2与4进行异或运算,计算过程如下

 
 

a被赋值为6,二进制表示110

第二次

6与4进行异或运算,此处就将变量a原来的值赋予了变量b:

 
 

变量b被赋值为2,交换获得a变量原来的值

第三次

6与2进行异或运算,变量a交换获得原来变量b的值,完成

 
 

加法更加容易

转载于:https://www.cnblogs.com/huilixieqi/p/9706226.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C++的代码实现,使用了动态内存分配和迭代的方式实现算法,时间复杂度为O(n!),空间复杂度为O(n): ```c++ #include <iostream> #include <stack> #include <cstring> using namespace std; void print_arr(int *arr, int n) { for (int i = 0; i < n; i++) { cout << arr[i]; } cout << endl; } void swap(int *arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } bool is_valid(int *arr, int n) { int counts[n + 1]; memset(counts, 0, sizeof(counts)); for (int i = 0; i < 2 * n; i++) { counts[arr[i]]++; if (counts[arr[i]] > i / 2 + 1) { return false; } } return true; } void find_permutation(int n) { int *arr = new int[2 * n]; for (int i = 0; i < n; i++) { arr[i * 2] = arr[i * 2 + 1] = i + 1; } stack<int> s; int i = 0; bool found = false; while (i < 2 * n) { if (s.empty() || s.top() <= arr[i]) { s.push(i); i++; if (i == 2 * n) { if (is_valid(arr, n)) { print_arr(arr, 2 * n); found = true; } } } else { int j = s.top(); s.pop(); for (int k = i; k < 2 * n; k++) { if (s.empty() || s.top() <= arr[k]) { swap(arr, j, k); s.push(j); i = j + 1; break; } } } } if (!found) { cout << "No valid permutations." << endl; } delete[] arr; } int main() { int n; cout << "Enter n: "; cin >> n; find_permutation(n); return 0; } ``` 在这里,我们首先使用动态内存分配来创建一个大小为2n的整型数组arr来存储数列。在is_valid函数中,我们使用一个counts数组来记录每个数出现的次数,如果发现某个数出现的次数超过了限制,就返回false。在find_permutation函数中,我们使用一个栈来记录回溯过程中需要回溯的位置。如果栈为空,或者栈顶元素小于等于当前元素,就将当前元素加入栈中,并继续向后遍历。否则,就从栈中取出最后一个需要回溯的位置j,然后从当前位置i开始向后遍历,找到第一个大于等于栈顶元素的位置k,并将位置j和k上的元素交换。然后将位置j重加入栈中,并将i更为j+1。如果遍历完所有元素后发现存在合法的排列,就将其输出。如果没有找到合法的排列,就输出提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值