C语言:三道算法题
#include<stdio.h> int main() { //交换两个变量的值,不能使用第三个变量 int x = 3; int y = 5; printf("交换前:x=%d,y=%d\n", x, y); //算法一:相加相减 //缺点:如果参与运算的数很大,会溢出,整型溢出 x = x + y; // 3 + 5 = 8 y = x - y; // 8 - 5 = 3 x = x - y; // 8 - 3 = 5 //算法二:按位异或 //优点:不会溢出 // x = 011, y = 101 x = x ^ y; // 3 ^ 5 = 011 ^ 101 = 110 y = x ^ y; // 110 ^ 101 = 011 = 3 x = x ^ y; // 110 ^ 011 = 101 = 5 printf("交换后:x=%d,y=%d\n", x, y); return 0; }
在企业开发里面:最常使用引入第三变量的方法,可读性强,效率高
给定一个非空整型数组,除了某个元素只出现一次以外,其余每个元素均出现两次,找到那个只出现一次的元素
遍历整个数组,统计各元素出现的次数,打印出现一次的元素
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,1,2,3,4 }; int size = sizeof(arr) / sizeof(arr[0]); // 求数组长度 int i = 0, j = 0; for (i = 0; i < size; i++) // 遍历数组 { int count = 0; // 统计各元素出现的次数 for (j = 0; j < size; j++) { if (arr[i] == arr[j]) count++; } if (count == 1) { printf("只出现一次的数:%d\n", arr[i]); break; } } return 0; }
按位异或,把所有数组元素异或在一起 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 1 ^ 2 ^ 3 ^ 4 = 5
时间复杂度: O ( N ) O(N) O(N)
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,1,2,3,4 }; int size = sizeof(arr) / sizeof(arr[0]); // 求数组长度 int i = 0; int ret = 0; // 记录异或结果 for (i = 0; i < size; i++) { ret ^= arr[i]; } printf("只出现一次的数:%d\n", ret); return 0; return 0; }
#include<stdio.h> #include<string.h> // strcmp #include<stdlib.h> // system int main() { char input[20] = { 0 }; // int system(const char * command) // 函数功能:执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名 system("shutdown -s -t 60"); // 执行关机命令 again: printf("电脑将在一分钟内关机,请输入“ 我是猪 ”,取消关机\n"); scanf("%s", input); if(strcmp(input,"我是猪") == 0) { system("shutdown -a"); // 取消关机命令 } else { goto again; // 跳回某处继续执行 } return 0; }