- 博客(21)
- 资源 (16)
- 收藏
- 关注
原创 查找出现次数超过一半的数
给定有n个数的数组a,其中超过一半的数为一个定值,在不进行排序,不开设额外数组的情况下,以最高效的算法找出这个数。int find(int *a, int n){ if (a == NULL || n < 1) { return -1; } int result = *a; int count = 1; for (int i = 1; i < n; i++)
2013-09-30 00:11:37 987
原创 查找和为某一值的两个数
给定一个有序数组a,长度为len,和一个数x,判断A数组里面是否存在两个数,他们的和为x。bool judge(int *a, int len, int x){ if (a == NULL) { return false; } int *left = a; int *right = a+len-1; while (left < right) { in
2013-09-29 23:49:28 685
原创 查找数组最大最小值
设计一个最优算法来查找一个n个元素数组中的最大值和最小值。一直一种需要比较2n次的方法,请给出一个更优的算法。请特别注意优化时间复杂度的常数。void fun(int a[], int n){ if (a == NULL) { return; } int max = a[0]; int min = a[0]; int len = (n&1)? n : n-
2013-09-29 23:18:05 2918
原创 字符串压缩
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。压缩规则: 1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。 2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。要求实
2013-09-29 22:24:02 694
原创 翻转单词
输入一个字符串,里面含有若干个单词,每两个单词之间用一个空格分隔。要求翻转该字符串中的单词。如:this is a test 反转为:test a is this。void reverse(char *left, char *right){ while (left < right) { swap(*left, *right); left++; right--
2013-09-29 00:31:57 567
原创 数组奇偶数排序
输入一个整数数组,要求重新排序,将奇数放在数组前面,偶数放在后面。时间复杂度O(n), 空间复杂度O(1)。void fun(int a[], int n){ if ((a == NULL) || n < 2) { return; } int p = 0; int q = -1; while (p < n) { if (a[p] & 1) {
2013-09-27 21:16:18 3405
原创 分割单向链表
将一个单向链表分成两部分,如果节点总数为奇数,则第一部分比第二部分的节点数多一。如1,2,3,4,5分割为1,2,3 和4,5。void FrontBackSplit(Node *head, Node **front, Node **back){ if (NULL == head) { return; } Node *p = head; Node *q = h
2013-09-27 00:00:20 928
原创 路线总数
有一个m行n列的棋盘,从左上角走到右下角,每次只能向右或向下走一步,计算有多少种不重复的路线。const int M_MAX = 100;const int N_MAX = 100;int fun(int m, int n){ int buf[M_MAX+2][N_MAX+2] = {0}; buf[m][n+1] = 1; for (int i = m;
2013-09-23 23:25:42 883
原创 最长无重复子字符串
输入一个字符串,计算最长的不包含重复字符的子字符串。如:"abcabcbb"的最长无重复子字符串为“abc”,输出结果为3。"bbbbbb"的最长无重复子字符串为"b",输出结果为1.#include int fun(string s){ int n = s.length(); int p = 0; int q = 0; bool flag[256] = {false,
2013-09-21 17:20:18 814
原创 数字的积
输入一个长度为n的整数数组a[n],输出为长度为n的整数数组output[n],要求output[i]的值为除了除了a[i]之外其它所有数组a内元素的乘积。不能用除法,并且时间复杂度要求为O(n)。例如输入{4, 3, 2, 1, 2},输出{12, 16, 24, 48, 24}。方法一:void fun(int a[], int output[], int n){ int *b
2013-09-20 23:18:23 914
原创 向循环有序链表内插入一个节点
Node* insert(Node* aNode, int x){ if (aNode == NULL) { aNode = new Node(x); aNode->next = aNode; return aNode; } Node *prev = aNode; Node *p = prev->next; do { if (prev->value
2013-09-20 20:44:53 1667
原创 删除字符串中特定字符
删除字符串中的“b”和“ac”,需要满足如下的条件:字符串只能遍历一次;不能够使用额外的空间。例如:acbac ==> "";aaac ==> aa;ababac ==> aa;bbbbd ==> d;aaccac==>"";abcac==>"";aaaccc==>"";aaabccc==>""。void fun(char *a){ if (a == NULL) { return
2013-09-20 12:02:10 1480
原创 统计无符号整数比特位为1的数量
int fun(unsigned int a){ int count = 0; while (a) { a = a & (a-1); count++; } return count;}
2013-09-18 00:37:20 1784
原创 去除字符串的空格
写一个函数消除字符串内的空格。代码要求尽量简洁。void removeSpace(char *str){ char *p = str; char *q = str; do { while (*q == ' ') { q++; } } while (*(p++) = *(q++));}
2013-09-17 00:42:08 614
转载 数字出现次数
给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。要求在O(n)的时间复杂度,O(1)的空间复杂度要求下完成。void fun(int a[], int n){ for (int i = 0; i < n; i++) { a[(a[i]%(n+1))-1] += (n+
2013-09-14 02:25:48 752
原创 判断整数是否是回文数
判断一个整数是否是回文数,不能使用额外空间。bool isPalindrome(int x){ if (x < 0) { return false; } int l = 1; while (x/l > 9) { l *= 10; } int r = 1; while (l > r) { if (((x/l)%10) != ((x/r)%1
2013-09-14 00:05:39 858
原创 二叉树的最低父节点
给定二叉树中的两个节点,要求返回这两个节点的最低父节点。Node* LCA(Node *root, Node *p, Node *q){ if (root == NULL) { return NULL; } if (root == p || root == q) { return root; } Node *left = LCA(root->left,
2013-09-11 00:17:31 745
原创 二叉树重建
输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。#include #include using namespace std;char s[100];void build(int n, char *s1, char *s2, char *s){ if (n <= 0) { return; } int p = strchr(s2, s1[0]) -
2013-09-08 11:59:36 635
转载 小球下落
有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有节点从上到下从左到右编号为1,2,3,4,5...2^D-1。在节点1处放一个小球,它会往下落。每个内节点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,它的状态都会改变。当小球到达一个内节点时,如果该节点上的开关关闭,则往左走,否则往右走,直到走到叶子节点。一些小球从节点1处依次开始下落,最后一个小球将回落到哪里?输入叶子深度D
2013-09-07 23:31:30 929 1
原创 因子和阶乘
输入正整数n(2如5! = 3, 1, 153! = 49, 23, 12, 8, 4, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1#include #include using namespace std;int prime[100];int count = 0;bool isPrime(int a){ for (int i = 2; i
2013-09-05 01:20:53 1305
原创 字符串消除
给定一个字符串,仅由a,b,c 3种小写字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出现,你把它们替换为字母c; 有ac或ca连续出现时,你可以把它们替换为字母b; 有bc或cb 连续出现时,你可以把它们替换为字母a。 你可以不断反复按照这个规则进行替换,你的目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。 输入:字符串。长度不超过20
2013-09-01 03:17:30 618
exceptional c++ style中文版 pdf 刘未鹏译
2010-09-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人