编程
yang20141109
这个作者很懒,什么都没留下…
展开
-
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如:如果输入的矩阵如下图所示:则顺时针打印的序列为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。 解析:我们可以一圈一圈的打印矩阵,要一圈一圈的打印矩阵,必须获得圈的边界:圈的起始行和终止行,以及圈的起始列和终止列。打印的结束条件是:(1)起始行和终止行相同。(2)起始列和终止原创 2016-05-25 21:34:25 · 379 阅读 · 0 评论 -
最大映射
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大? 输入描述:每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不原创 2016-04-29 22:04:06 · 2894 阅读 · 4 评论 -
x或y等于x加y
给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。 暴力枚举法:我们从1遍历到最大的长整型数(long long),求出满足要求的第k小的数。时间复杂度过于庞大。代码如下:int theN原创 2016-04-29 20:57:36 · 2415 阅读 · 0 评论 -
数组中取出下标不连续的任意个数,求取出的数的和的最大值
给定一个数组,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值,例如:给出数组A[]={1,2,2,5,3,4,3}可以取出的最大和为2+5+4=11。现再给定数组{3,9,7,5,1,3,1,2,7},能取出的数的和的最大值是24。 解析:典型的动态规划思想,设置一个辅助数组,大小和原数组的大小一样,辅助数组中值表示从原数组起始位置开始到当前下标位置截止的和最大值。比如原创 2016-04-16 20:41:54 · 4449 阅读 · 0 评论 -
数组中只出现一次的两个数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法一:时间复杂度为o(n*n)。扫描数组中的每个元素,查看该元素在数组中出现的次数。直到找到两个出现一次的数字为止。 方法二:时间复杂度为o(n)。扫描两遍数组即可。第一遍扫描时,对数组中的每个元素作异或操作。最终结果存储在变量val。val值和两个只出现一次的数字的异或结果相同。然原创 2016-03-27 11:18:24 · 382 阅读 · 0 评论 -
判断两个链表是否相交
给出两个单向链表的头指针,比如pHead1和pHead2,判断这两个链表是否相交,如果相交求出第一个相交的结点。 方法一:由于两个链表没有环,我们可以把第二个链表的尾指针指向第一个链表的头结点,此时我们从链表二出发,判断这个新的链表是否存在环,如果存在环则说明这两个链表相交,否则,这两个链表不相交。环的连接点即两个链表的第一个交点。在上一篇博客中我们已经说过如何判断一个链表是否存在环,而原创 2016-01-17 17:31:15 · 422 阅读 · 0 评论 -
C++ 实现矩阵乘法
矩阵相乘的时间复杂度为o(n*n*n)。使用vector>来表示矩阵。#include#includeusing namespace std;vector> matrix_multiply(vector> arrA, vector> arrB){ //矩阵arrA的行数 int rowA = arrA.size(); //矩阵arrA的列数 int colA = arrA[0].原创 2016-03-31 10:58:14 · 16440 阅读 · 2 评论 -
反转链表(递归与非递归)
题目:定义一个函数,输入一个链表的头结点,反转该链表。 方法一:如果链表只有一个结点或者链表为空,我们直接返回,如果链表的长度大于等于2,我们从第二个结点开始采用头插法插入到链表中。void reverseList(ListNode *&pHead){ if(pHead == NULL)//判断链表是否为空 return; ListNode *p = pHead->next;原创 2016-01-17 21:37:11 · 359 阅读 · 0 评论 -
单链表中是否有环(长度和连接点)
给定一个单链表,只给出头结点指针pHead: (1)如何判断链表中是否存在环。 (2)如何知道环的长度。 (3)如何找出环的连接点。 (4)带环链表的长度。 问题一,我们设置两个指针slow和fast,slow指针每次只走一步,fast指针每次走两步,如果fast指针可以追赶上slow指针,也就是说fast指针和slow指针相等。那么我们就说链表中原创 2016-01-17 16:10:27 · 572 阅读 · 0 评论 -
使用快速排序,求最大的k个数
使用快排的思想,求k最大的数。o(n*logk)#includeusing namespace std;int partition(int arr[],int p,int r)//每一次划分所产生的结果{ int x = arr[r];//选择末尾元素作为枢轴 int i = p -1; for(int j = p; j < r; ++j) { if(arr[j] > x)原创 2015-04-21 16:37:38 · 731 阅读 · 1 评论 -
求最大公约数
gcd()方法中使用的辗转取余数法 f(v1,v2) = f(v2, v1 % v2)。gcd1()也是辗转取余数法,不过用的递归实现的。gcd2()使用的是相减法,f(v1,v2) = f(v1-v2,v2)。这两个方法都要缺陷,如果是大整数的数的话,方法gcd()取余数操作会耗时,gcd2()方法如果两个数相差很大,会多次递归。#include#includeusi原创 2015-04-21 21:53:05 · 375 阅读 · 0 评论 -
char arr[] 和 char *arr区别
char arr[] = "hello world";//arr为数组的名称,数组中的内容在栈中,出去数组所在的作用域,所占用的空间就被释放。char *arr = "hello world";//arr为指针,arr占用的内存为栈中的内存,但其指向的内存在静态存储区,静态存储区的空间在程序结束的时候,才被释放。下面是一个小的程序,GetString01() 和Ge原创 2015-06-02 20:30:50 · 5290 阅读 · 2 评论 -
已知圆的半径和弧长求弧的终点坐标(360春招跑步编程题)
小明同学喜欢体育锻炼,他常常去操场上跑步。跑道是一个圆形,在本题中,我们认为跑道是一个半径为R的圆形,设圆心的坐标为原点(0,0)。小明跑步的起点坐标为(R,0),他沿着圆形跑道跑步,而且一直沿着一个方向跑步。回到家后,他查看了自己的计步器,计步器显示他跑步的总路程为L。小明想知道自己结束跑步时的坐标,但是他忘记自己是沿着顺时针方向还是逆时针方向跑的了。他想知道在这两种情况下的答案分别是多原创 2017-03-18 22:12:12 · 3106 阅读 · 0 评论