《Cracking the Coding Interview》——第11章:排序和搜索——题目8

2014-03-21 22:23

题目:假设你一开始有一个空数组,你在读入一些整数并将其插入到数组中,保证插入之后数组一直按升序排列。在读入的过程中,你还可以进行一种操作:查询某个值val是否存在于数组中,并给出这个元素在数组中的位置(如果有多个的重复元素话,给出最小的下标)。

解法:书上的原题不是这么描述的,但我觉得用这种插入排序的说法更好理解。虽然说是数组,但实际上既可以用真的数组来模拟这一过程,也可以用一棵二叉搜索树来做。我的实现是用二叉搜索树,每个节点里除了记录元素的值之外,还记录它的左子树有多少个点。这样在树里面也能进行对数级的查找。其实,用数组直接模拟的话,代码应该更好写的。

代码:

 1 // 11.8 Given an array of integers, find out for a given value, how many integers are there in the array, that are no greater than the value.
 2 // If the value is not in the array, return -1 instead.
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <string>
 6 using namespace std;
 7 
 8 struct TreeNode {
 9     int val;
10     int count;
11     int count_left;
12     TreeNode *left;
13     TreeNode *right;
14     TreeNode(int _val = 0): val(_val), count(1), count_left(0), left(nullptr), right(nullptr) {};
15 };
16 
17 void insertNode(TreeNode *&root, int val)
18 {
19     if (root == nullptr) {
20         root = new TreeNode(val);
21     } else if (val == root->val) {
22         ++(root->count);
23     } else if (val < root->val) {
24         ++(root->count_left);
25         insertNode(root->left, val);
26     } else {
27         insertNode(root->right, val);
28     }
29 }
30 
31 int getRank(TreeNode *root, int val)
32 {
33     int result;
34     TreeNode *ptr;
35     
36     result = 0;
37     ptr = root;
38     while (ptr != nullptr) {
39         if (ptr->val > val) {
40             ptr = ptr->left;
41         } else if (ptr->val < val) {
42             result += ptr->count_left + 1;
43             ptr = ptr->right;
44         } else {
45             break;
46         }
47     }
48     if (ptr != nullptr) {
49         result += ptr->count_left;
50         return result;
51     } else {
52         return -1;
53     }
54 }
55 
56 void clearTree(TreeNode *&root)
57 {
58     if (root != nullptr) {
59         clearTree(root->left);
60         clearTree(root->right);
61         delete root;
62         root = nullptr;
63     }
64 }
65 
66 int main()
67 {
68     int val;
69     TreeNode *root;
70     string s;
71     
72     root = nullptr;
73     while (cin >> s) {
74         if (s == "i") {
75             cin >> val;
76             insertNode(root, val);
77         } else if (s == "r") {
78             cin >> val;
79             printf("rank = %d\n", getRank(root, val));
80         } else if (s == "e") {
81             break;
82         }
83     }
84     clearTree(root);
85     
86     return 0;
87 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3616871.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gradle打包java项目_gradle打包java项目

转载地址&#xff1a;http://www.gfzj.us/series/gradle/2014/12/12/gradle%E5%B0%8F%E7%B3%BB%E5%88%97(4)--gradle%E6%89%93%E5%8C%85java%E9%A1%B9%E7%9B%AE.html以gradle小系列所举例子为示例&#xff0c;在此处介绍两种gradle发布java项目的方法&#xff1a;fat jar方式该…

堡垒机2.0

一、编辑系统环境变量&#xff0c;让用户登录后自动调用脚本 1 vim /etc/profile 2 python /baolei/ssh_login.py 3 # 判断登录用户是否为 root 用户&#xff0c;root用户退出程序不进行logout操作&#xff0c;否则则logout 4 if [ $? ! 10 ];then 5 echo "Good …

Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原

Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原 近 日在项目当中需要将图片保存到共享对象当中&#xff0c;开始用了俩天的时间做了对象的序列化&#xff0c;并以BitmapData的形式进行了图片的序列化保存共享&#xff0c;因为系统 没有提供更好的接口所以…

java8自定义收集器_使用自定义收集器进行Java 8分组?

我有以下课程。class Person {String name;LocalDate birthday;Sex gender;String emailAddress;public int getAge() {return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears();}public String getName() {return name;}}我希望能够按年龄分组&#xff0c;然后收…

poj 1862 Stripies/优先队列

原题链接&#xff1a;http://poj.org/problem?id1862 简单题&#xff0c;贪心优先队列主要练习一下stl大根堆 写了几种实现方式写成类的形式还是要慢一些。。。 手打的heap&#xff1a; 1&#xff1a; 1 #include<cstdio>2 #include<cstdlib>3 #include<cmath&…

java url下载ics_使用Microsoft Graph API处理外部(Internet / .ics)日历URL

在新的Graph API中&#xff0c;是否可以根据外部.ics日历网址为用户创建新日历&#xff1f;我d like to do is to use a daemon to inject a link to an external calendar into the list of calendars a user has if they don已经有了这样一个链接 . 这将有效地复制用户可以在…

命令行生成jar文件

1.打开cmd&#xff0c;进入编译完后所有类的当前目录 命令行 jar -cvf javaname.jar *.class 这时已经生成了 javaname.jar 不过如果有多个类&#xff0c;双击打不开 2.解压javaname.jar 进入META-INF&#xff0c;编辑MANIFEST.MF: 尾行写入Main-Class:&#xff08;&…

Github链接地址

https://github.com/kzj1/test转载于:https://www.cnblogs.com/lalal/p/4456923.html

java foreach和for循环区别_java相关:老生常谈foreach(增强for循环)和for的区别

java相关&#xff1a;老生常谈foreach(增强for循环)和for的区别发布于 2020-8-18|复制链接下面小妖就为大家带来一篇老生常谈foreach(增强for循环)和for的区别。小妖觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小妖过来看看吧首先说一下f…

关于事件冒泡和捕获的问题

由于习惯于jquery的方便操作&#xff0c;往往让我们慢慢淡忘了原生js应有的功能和属性&#xff0c;今天重温一下事件冒泡和捕获问题。 冒泡&#xff1a;从内向外&#xff0c;如&#xff1a;div > body > html (不同浏览器稍有不同) 捕获&#xff1a;从外向内&#xff0c;…

root无法运行命令解决办法

今天运行一个命令wget(wg再使用tab键无法使用)&#xff0c;如下提示 -bash: /usr/bin/wget: 权限不够 [rootwww /]# ls -Z /usr/bin/wget-rw-r--r--. root root system_u:object_r:bin_t:s0 /usr/bin/wget发现没有执行权限 chmod x /usr/bin/wget -bash: /usr/bin/wget: …

java类编写sql_用JavaBean编写SQL Server数据库连接类

以下为引用的内容&#xff1a;//类conn.db.conndb.javapackage conn.db;import java.sql.*;public class conndb {Connection conn;ResultSet rs;private int count;public conndb() {try {Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");} catch (Exception ex) {}…

ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、

1.Request.ApplicationPath->当前应用的目录 Jsp中, ApplicationPath指的是当前的application(应用程序)的目录,ASP.NET中也是这个意思。 对应的--例如我的服务器上有两个web应用域名都是mockte.com 一个映射到目录mockte.com/1/ 另一个影射到 http://mockte.com/2/ …

java timezone id_java.util.TimeZone.setID()方法实例

全屏setID(String ID)方法被用于设置时区ID。这不会改变的时区对象中的任何其他数据。声明以下是java.util.TimeZone.setID()方法的声明。public void setID(String ID)参数ID--这是新的时区ID。返回值NA异常NA例子下面的例子显示java.util.TimeZone.setID()方法的使用package …

c语言中赋值截断

在c语言中进行变量赋值的时候&#xff0c;如果将字节多的数据类型赋给一个占字节少的变量类型&#xff0c;会发生“截断”。 发生这种情况的原因是&#xff1a;在赋值过程中只将占字节较长的变量的地位赋给占字节较少的变量。 如&#xff1a; int i345&#xff1b; char c‘…

创建一个自己的GitHub,创建自己的开源项目

作者是一个大学在读学生&#xff0c;自己在平时的学习中&#xff0c;GitHub上的开源项目给自己提供了很大的帮助。GitHub是目前使用最广泛的分布式项目管理软件&#xff0c;GitHub上面托管了许多非常优秀的开源项目。我觉得每一个从事IT行业都应该有一个属于自己的GitHub。下面…

设计模式之行为型(1)-职责链模式(Chain)

设计模式之行为型(1)-职责链模式(Chain)转载于:https://www.cnblogs.com/lihuali/p/7493415.html

php apache win7,win7安装apache+php

转自百度经验1 系统环境与软件1php5.5.6 下载链接&#xff1a;http://windows.php.net/download/#php-5.5推荐 V11 x64&#xff0c;也就是64bit的。2apache2.4&#xff0c;下载链接&#xff1a;http://www.apachelounge.com/download/同样是推荐 V11&#xff0c;64位的。3前面提…

photoshop 常用快捷键大全

一、文件新建 CTRLN打开 CTRLO 打开为 ALTCTRLO关闭 CTRLW保存 CTRLS 另存为 CTRLSHIFTS另存为网页格式 CTRLALTS打印设置 CTRLALTP页面设置 CTRLSHIFTP打印 CTRLP退出 CTRLQ 二、编辑撤消 CTRLZ向前一步 CTRLSHIFTZ向后一步 CTRLALTZ退取 CTRLSHIFTF剪切 CTRLX复制 CTRLC合并…

Ubuntu如何安装setuptools

首先百度setuptools&#xff0c;基本第一个就是官网的结果然后我们看到有两个这样的文件第一个不用想了&#xff0c;如果你要使用第一个的话&#xff0c;还要首先安装wheel。我们这里直接用鼠标选中第二个zip文件&#xff0c;然后右键&#xff0c;复制链接。然后在我们的Ubuntu…