38. 数字 k 在有序数组中出现的次数

二分查找:找出第一个 k 和最后一个 k 。

#include <iostream>
using namespace std;
int getFirstOfK(int data[], int length, int k, int low, int high)
{
if(low <= high)
{
int mid = (low + high) / 2;
if(data[mid] == k && (mid == 0 || data[mid-1] != k))
return mid;
else if(data[mid] < k)
low = mid + 1;
else high = mid - 1;
return getFirstOfK(data, length, k, low, high);
}
return -1;
}
int getLastOfK(int data[], int length, int k, int low, int high)
{
if(low <= high)
{
int mid = (low + high) / 2;
if(data[mid] == k && (mid == length-1 || data[mid+1] != k))
return mid;
else if(data[mid] > k)
high = mid - 1;
else low = mid + 1;
return getLastOfK(data, length, k, low, high);
}
return -1;
}
int getNumberOfK(int data[], int length, int k)
{
int count = 0;
if(data != NULL && length > 0)
{
int first = getFirstOfK(data, length, k, 0, length-1);
if(first == -1) return -1; int last = getLastOfK(data, length, k, first, length-1);
count = last - first + 1;
}
return count;
}
int main()
{
int data[] = {1, 2, 3, 3, 3, 3, 4, 5};
cout << getNumberOfK(data, sizeof(data)/4, 3) << endl;
cout << getNumberOfK(data, sizeof(data)/4, 1) << endl;
cout << getNumberOfK(data, sizeof(data)/4, 2) << endl;
cout << getNumberOfK(data, sizeof(data)/4, 5) << endl; return 0;
}

39. 二叉树的深度 && 平衡二叉树的判断 &&  二叉树结点的最大距离(题目来自编程之美,解法自创)

note:三种算法都必须是后序遍历。

#include <iostream>
#include <string>
using namespace std;
typedef struct BTNode
{
int v; // default positive Integer.
BTNode *pLeft;
BTNode *pRight;
BTNode(int x) : v(x), pLeft(NULL), pRight(NULL) {}
} BinaryTree;
/********************************************************/
/***** Basic functions ***********/
BinaryTree* createBinaryTree() // input a preOrder traversal sequence, 0 denote empty node.
{
BTNode *pRoot = NULL;
int r;
cin >> r;
if(r != 0) // equal to if(!r) return;
{
pRoot = new BTNode(r);
pRoot->pLeft = createBinaryTree();
pRoot->pRight = createBinaryTree(); }
return pRoot;
}
void release(BinaryTree *root){
if(root == NULL) return;
release(root->pLeft);
release(root->pRight);
delete[] root;
root = NULL;
}
void print(BinaryTree *root, int level = 1){
if(root == NULL) { cout << "NULL"; return; };
string s;
for(int i = 0; i < level; ++i) s += " ";
cout << root->v << endl << s;
print(root->pLeft, level+1);
cout << endl << s;
print(root->pRight, level+1);
}
/******************************************************************/
int getDepth(BinaryTree *root) // leaf Node is at depth 1
{
if(root == NULL) return 0;
int leftDepth = getDepth(root->pLeft);
int rightDepth = getDepth(root->pRight);
return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
} bool isBalanced(BinaryTree *root, int *depth) // must be postOrder traversal
{
if(root == NULL) { *depth = 0; return true; };
int leftDepth, rightDepth;
if(isBalanced(root->pLeft, &leftDepth) && isBalanced(root->pRight, &rightDepth))
{
*depth = 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
if(leftDepth - rightDepth >= -1 && leftDepth - rightDepth <= 1)
return true;
else
return false;
}
}
bool isBalanced(BinaryTree *root)
{
int depth;
return isBalanced(root, &depth);
} int getMaxDistance(BinaryTree *root, int *maxDistance) // leaf node depth is set to 0
{
if(root == NULL) return -1;
int leftDepth = getMaxDistance(root->pLeft, maxDistance);
int rightDepth = getMaxDistance(root->pRight, maxDistance);
if(*maxDistance < 2 + leftDepth + rightDepth)
*maxDistance = 2 + leftDepth + rightDepth;
return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
}
int getMaxDistance(BinaryTree *root)
{
int maxDistance = 0;
getMaxDistance(root, &maxDistance);
return maxDistance;
}
int main(){
int TestTime = 3, k = 1;
while(k <= TestTime)
{
cout << "Test " << k++ << ":" << endl; cout << "Create a tree: " << endl;
BinaryTree *pRoot = createBinaryTree();
print(pRoot);
cout << endl; cout << "The depth of binary tree: " << getDepth(pRoot) << endl; if(isBalanced(pRoot))
cout << "Does the tree is a balanced binary tree ? true" << endl;
else
cout << "Does the tree is a balanced binary tree ? false" << endl; cout << "The max distance between two nodes: " << getMaxDistance(pRoot) << endl; release(pRoot);
}
return 0;
}

40. 数组中只出现一次的数字

首先, 参考 Link: Single Number

其次,数组中有两个只出现一次的数字时:  例:{2,4,3,6,3,2,5,5}

#include <iostream>
using namespace std;
void findTwoNumbers(int data[], int length, int *num1, int *num2)
{
if(data == NULL || length < 2) return;
int total = 0;
for(int i = 0; i < length; ++i)
total ^= data[i];
int shift1 = 1;
for(int i = 0; i < sizeof(int)*8; ++i)
{
total >>= 1;
shift1 <<= 1;
if(total & 1)
break;
}
*num1 = *num2 = 0;
for(int i = 0; i < length; ++i)
{
if(data[i] & shift1) *num1 ^= data[i];
else *num2 ^= data[i];
}
}
int main(){
int num1, num2;
int test1[8] = { 2, 4, 3, 6, 3, 2, 5, 5};
findTwoNumbers(test1, 8, &num1, &num2);
cout << num1 << " "<< num2 << endl;
return 0;
}

41. 和为 S 的连续正数序列。

#include <iostream>
using namespace std;
void numsSumToS(int S)
{
int low = 1, high = 2;
while(low < high)
{
int curSum = 0;
for(int i = low; i <= high; ++i)
curSum += i;
if(curSum < S) ++high;
else if(curSum > S) ++low;
else
{
for(int i = low; i <= high; ++i)
cout << i << '\t';
cout << endl;
++high;
}
}
}
int main(){
int S;
while(true)
{
cout << "cin >> ";
cin >> S;
numsSumToS(S);
}
return 0;
}

42. 翻转单词顺序 && 字符串左旋转

note:左旋转 k 位相当于右旋转 N – k 位, N 为字符串长度。

Link:   7. Reverse Words in a String

Chap6: question38 - 42的更多相关文章

  1. (转)win7 64 安装mysql-python:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory

    原文地址:http://www.cnblogs.com/fnng/p/4115607.html 作者:虫师 今天想在在win7 64位环境下使用python 操作mysql 在安装MySQL-pyth ...

  2. Effective Modern C++ 42 Specific Ways to Improve Your Use of C++11 and C++14

    Item 1: Understand template type deduction. Item 2: Understand auto type deduction. Item 3: Understa ...

  3. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...

  4. PAT mooc DataStructure 4-2 SetCollection

    数据结构习题集-4-2 集合的运用 1.题目: We have a network of computers and a list of bi-directional connections. Eac ...

  5. PHP开发程序应该注意的42个优化准则

    PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法.它可以比 CGI或者Perl更快速的执行动态网页.用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML ...

  6. win7 64 安装mysql-python:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory

    今天想在在win7 64位环境下使用python 操作mysql 在安装MySQL-python 时报错: _mysql.c _mysql.c(42) : fatal error C1083: Can ...

  7. Atitit  J2EE平台相关规范--39个  3.J2SE平台相关规范--42个

    Atitit  J2EE平台相关规范--39个  3.J2SE平台相关规范--42个 2.J2EE平台相关规范--39个5 XML Parsing Specification16 J2EE Conne ...

  8. 每天一个linux命令(42):kill命令

    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须 ...

  9. AC日记——画矩形 1.5 42

    42:画矩形 总时间限制:  1000ms 内存限制:  65536kB 描述 根据参数,画出矩形. 输入 输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽 ...

随机推荐

  1. Windows 7中无法访问FTP的解决方法

    解决: netsh advfirewall set global StatefulFTP disable

  2. CodeForces 688D-Remainders Game

    题意: 已知n, k与n个整数(c1,c2,...,cn),问你是否存在一个数x,使得它能被n个整数且k整除. 分析: 可以先将n个整数的最小公倍数lcm计算出来,再判断它是否能被k整除. 代码如下: ...

  3. url编码 中文在url参数中传递,在请求头,响应头中传递,是如何编码的呢?

    一定要编码成url的吗?还是url自动把接受的汉字编码,请求头响应头到达之后再自动编码成汉字?这样似乎比较合理哦 先把iso8859-1 转换成 utf-8,在mvc中处理,然后响应的时候在转成iso ...

  4. CSS3-Media Query 基础

    一.常见的属性: device-width , device-height 屏幕宽高 width , height 渲染窗口宽高 orientation 设备方向 resolution 设备分辨率 二 ...

  5. Android常见控件— — —EditText

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  6. MySQL文件目录格式及存放位置

    了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm ...

  7. 详解<a>标签

    相信对于学前端的人而言<a>标签并不陌生,我们先把他所有的属性列出来 一.主要属性 一般来说,a标签有着四种状态,分别是link,hover,active,visited,接下来我会仔细讲 ...

  8. 日常笔记 ---- 图形学-Frenel函数材质球实现方式

    图形学-Frenel函数材质球实现方式   调个材质 大概公式 自发光= 自定义边光颜色* ((1-法线与视角方向点乘)的 自定义幂次方 ) 这个是比较简单方法   模型的法线与视角方向 角度越大 表 ...

  9. dij单源最短路纯模板

    #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> ...

  10. flume+kafka+smart数据接入实施手册

    1.  概述 本手册主要介绍了,一个将传统数据接入到Hadoop集群的数据接入方案和实施方法.供数据接入和集群运维人员参考. 1.1.   整体方案 Flume作为日志收集工具,监控一个文件目录或者一 ...