求未配对的数(1):

在一组数据中有 只有一个数出现了一次,其余的数都是成对的出现,请找出这个数:这个题很容易解决,只要把这组数据全部异或(相同为零,不同为1),所以出现两次的数异或后就为零,最后剩下的就是出现一次的数。

#include<stdio.h>
#include<stdlib.h>int find_once_num(int arr[], int len )
{int num = 0;for (int i = 0; i < len; i++){num ^= arr[i];}return num;
}
int main()
{int arr[9] = { 8, 4, 2, 7, 9, 8, 4, 2, 7 };int ret=find_once_num(arr,9);printf( "%d\n",ret);system( "pause");return 0;
}

(2)

现在将题目变一下,一组数据中只有两个数出现了一次,其余数字都是成对出现的,请找出这两个数,这时就不能直接异或了,必须将这一组数据分成两块,每块只包含一个单独出现的数,这样剩下的问题就和第一题一样了,可关键是怎么分呢???

分析:我们可以先对这组数据进行排序,这样成对出现的数就相邻在一起了,我们再一对一对的比较,直到找到第一对不相等的数,然后从中分开,这样就分成两块了。

void bubble_sort(int arr[], int n )
{int flag = 0;int i = 0;int j = 0;for (i = 0; i < n - 1; i++){flag = 1;for (j = 0; j < n - i - 1; j++){if (arr [j]>arr[j + 1]){arr[j] = arr [j] + arr[j + 1];arr[j + 1] = arr [j] - arr[j + 1];arr[j] = arr [j] - arr[j + 1];flag = 0;}}if (flag == 1)break;}
}
int find_one_num(const int *p1,int len)
{assert(p1 );int num = 0;for (int i = 0; i <=len; i++){num ^= p1[i];}return num;
}
int main()
{int arr[10] = {0 ,1, 13, 18, 18,13,1,46,0,3};int i = 0;int *p = arr;bubble_sort(arr, 10);for (i = 0; i < 10 - 1;){if (p[i] == p[i + 1]){i += 2;}elsebreak;}printf( "%d   %d \n", find(p, i),find((p+i+1),9-i-1));system( "pause");return 0;
}

冒泡排序的优化:

上面对数组进行排序时,用到了冒泡排序法,通常我们使用冒泡排序法时会将每个数都与后面的数进行比较,这样虽然可以实现冒泡排序,但是却不是最优的方法,因为冒泡排序还可以进行优化。

优化:以升序为例

void bubble_sort(int arr[], int n )
{int flag = 0;int i = 0;int j = 0;for (i = 0; i < n - 1; i++){flag = 1;        //设置一个标记flag                for (j = 0; j < n - i - 1; j++)                  {//如果第1,2有序,第2,3也有序,后面的都有序,则不进入if,flag就不会变成0if (arr [j]>arr[j + 1])                              {                                               arr[j] = arr [j] + arr[j + 1];                          arr[j + 1] = arr [j] - arr[j + 1];                       arr[j] = arr [j] - arr[j + 1];flag = 0;                                                //只要前一个数大于后一个数,进入if,flag会变成1}}if (flag == 1)                                       break;        //如果flag为1,则就说明这组数据已经有序                }
}

strncpy的优化:

当n很大很大时,如果一个字节一个字节的copy效率会非常低下,所以我们要想一个办法,当n特别大时,使得一次性可以copy多个字节。其实这个办法就是强制类型转换,将char *转换为int *(在c中试了一下转换为double*,显示无法转换),这样一次就可以copy 4个字节,而当n小于4时再转换为char*进行copy.

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* my_strncpy(char *dst, const char *src, int len)
{assert(dst);assert(src);int* p1= (int *)dst;const int* p2 = (int *)src;while (len){if (len < 4){(char *)*p1=(char *)*p2;((char* )p1)++;((char *)p2)++;len--;}else{*p1++ = *p2++;len -= 4;}}(char *)*p1 = '\0';return  dst;
}
int main()
{char arr1[100];char arr2[50];int n = 0;scanf("%s%s%d", arr1, arr2,&n);char *ret = my_strncpy(arr1, arr2, n);printf("%s\n",ret);system("pause");return 0;
}

转载于:https://blog.51cto.com/11142019/1765871

求单独出现的数,冒泡排序优化,strncpy的优化相关推荐

  1. c语言中int下小数求余大数,Sicily1020-大数求余算法及优化

    Github最终优化代码: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1020.c 题目如下: 1020. ...

  2. python实现真正的冒泡排序算法(时间复杂度优化版)!

    近期很多童鞋在讨论大厂面试的算法题,有部分同学表示一脸懵逼,不知从何下手,还有一一部分同学写的冒泡排序算法是直接从网上复制下来的冒泡排序,大多数都没有考虑时间复杂度,说白了只是实现了冒泡的流程,严格来 ...

  3. hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

    题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...

  4. 对tf.reduce_mean API的理解就是求平均值,reduce指的是一串数据求平均值后维数降低了,可不是吗,一串向量变成了一个数,维数自然降低了

    tf.math.reduce_mean(input_tensor, axis=None, keepdims=False, name=None ) 对tf.reduce_mean的理解就是求平均值,re ...

  5. table 条数过大优化_MySQL 数据库优化,看这篇就够了 | 不长不短,2000 字小结

    前言 数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷. 1. 优 ...

  6. hdu 3333 Turing Tree 求区间内不同数的和——线段树解法

    http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意:求区间内不同数的和 #include<bits/stdc++.h> using name ...

  7. 求数组排序后相邻数的最大差值

    /** * 求数组排序后相邻数的最大差值 * @author Administrator * {9,3,1,10} 返回6 */ public class test12 { public static ...

  8. Java学习手册:(数据结构与算法-数组)如何求绝对值最小的数?

    问题: 有一个升序排列的数组,数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,例如,数组{-10,-5,-2,7,15,50},绝对值最小的是2. 方法一: 对于升序数组,求绝对值最小的数可 ...

  9. 【华为机试题HJ86】求最大连续bit数

    HJ86 求最大连续bit数 一.题目描述 二.参考代码1 三.参考代码2 一.题目描述 求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 二.参 ...

最新文章

  1. 用例图中的Actor(参与者)一定是人吗?
  2. SAP Commerce(SAP Hybris)学习资料汇总
  3. php websocket 是否在线_看完让你彻底理解WebSocket原理,附实战代码(包含前端和后端)...
  4. rap2检测哪些接口在使用_Apifox for Mac(接口调试管理工具)
  5. 说说windows下64位程序和32位程序
  6. linux 基础学习入门 5 inode 总结 tr tee 等小命令
  7. Zabbix 数据清理
  8. 计算机中缺少qt5quick.dll,qt5quick.dll
  9. 下行物理信道rs_LTE下行物理信道与物理信号
  10. VS好用系列之选择性粘贴
  11. 25张用Photoshop绘制的顶级图片
  12. 【计算机毕业设计】外卖点餐源码
  13. 针对芯片测试行业,常见stil,vcd,wgl,文件的转化,到93K,chroma,小总结
  14. 阿里云轻量服务器WordPress镜像建网站教程(图)
  15. IVX低代码平台开发——微信小程序实现抽奖功能
  16. 计算机ps2定义,软件硬件界面接口定义 bt656 硬件接口定义
  17. dellR730ch插拔sdka
  18. 信奥中的数学:抽屉原理
  19. 如何写好CSS?(OOCSS DRY SMACSS)
  20. html5城堡防御游戏《小英雄呼呼》截图

热门文章

  1. 苹果、微软等巨头107道机器学习面试题
  2. 人工智能成热点,斯坦福华人女教授提出这观点,研究院因她成立!
  3. 业界丨2018年能干大事儿的5家人工智能初创公司
  4. 深度丨当AI遇见区块链,2018年的第一场火,还是第一场泡沫?
  5. 元宇宙深度报告,共177页!
  6. 【综述专栏】图神经网络综述
  7. 深度报告:一文看懂生物芯片产业
  8. 记忆的天空:智能进化三部曲
  9. 人脑为何能够快速学习新知识? 用AI的视角来分析
  10. AI 白皮书:赢家、输家