Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)
之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了。不过算法主要还是思路嘛,而且JS应该都没问题吧^_^;)
这里是题目:
---------------------------分割线------------------------
蓄水池储水量问题
看图,可以将方块看做砖。题干很简单,问最多能放多少水。例如,图2就是图1可放的最多水(蓝色部分),如果将一块砖看做1的话,图2就是能放10个单位的水。图3可以放17个单位的水。上面每一个图的砖墙用int数组表示,每一个数组元素表示每一列砖墙的砖数(高度)。
(图1)
(图2)
(图3)
---------------------------我又来了------------------------
一开始我觉得挺简单,但是结果用了我一下午。 (╯°Д°)╯︵ ┻━┻坑爹啊这是!!!!
我代码我已经加上了每步的注释,相信各位应该是能很快的看懂的。(。・`ω´・)
好了,废话我不多说了,上代码。(σ`・д・)σ
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="../Script/jquery-1.9.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
//来自:http://www.cnblogs.com/cielwater
//开始值
var StartMax = 0;
//开始值位置
var StartIndex = 0;
//最小值
var MinNum = 0;
//最小值位置
var MinIndex = 0;
//结束值
var EndMax = 0;
//结束值位置
var EndIndex = 0;
$(document).ready(function () {
//初始值
var List = "12134565548";
$("body").append(List + "<br>");
//调用计算函数
ShuiChi(List);
});
//计算函数
function ShuiChi(Item) {
StartMax = Item[0];
StartIndex = 0;
MinNum = Item[0];
MinIndex = 0;
EndMax = Item[0];
EndIndex = 0;
//循环水池
for (var i = 0; i < Item.length; i++) {
//获取各种条件
if (StartMax <= Item[i] && MinNum == StartMax) {//判断是否为第一次碰到比之前大的值
//记录开始值
StartMax = Item[i];
//记录开始值位置
StartIndex = i;
//保存到结束值,用于之后的判断
MinNum = Item[i];
//保存结束值位置,用于之后的判断
MinIndex = i;
} else if (MinNum > Item[i]) {//判断是否比结束值还小
//将结束值赋予给开始值
StartMax = MinNum;
//将结束值位置赋予给开始值位置
StartIndex = MinIndex;
//保存新的结束值
MinNum = Item[i];
//保存新的结束值位置
MinIndex = i;
} else if (MinNum < Item[i]) {//判断是否比结束值大
//保存结束值
EndMax = Item[i];
//保存结束值位置
EndIndex = i;
}
//判断是否已经包含结束值,并且结束位值和开始位值位置相隔1以上
if (EndIndex > StartIndex + 1) {
//循环替换开始位值与结束位置的值
for (var j = StartIndex; j < EndIndex - 1; j++) {
//三元运算判断开始值与结束值,最小的值替换指定位置
Item = Item.substring(0, j + 1) + (EndMax < StartMax ? EndMax : StartMax) + Item.substring(j + 2, Item.length);
}
//递归
ShuiChi(Item);
//终止当前运算
return false;
}
}
//输出结果
$("body").append(Item + "<br>");
}
</script>
</head>
<body>
</body>
</html>
下面放出一段别人的代码,虽然我没怎么看过不过是给各位去看的。
多看看各种思路嘛(●'ω'●)丿❤
package a;
public class Test {
static int result = ; // 最终结果
static int[] wallHeights = new int[] { , , , , , , , , }; // 表示所有的墙的高度 public static void process(int start, int end) {
// first:start和end之间最高的墙
// second:start和end之间第二高的墙
int first = , second = ;
// firstIndex:第一高的墙在wallHeights中的索引
// secondIndex:第二高的墙在wallHeights中的索引
int firstIndex = , secondIndex = ;
// 两堵墙必须至少有一堵墙的距离
if (end - start <= )
return;
// 开始获取第一高和第二高墙的砖数
for (int i = start; i <= end; i++) {
if (wallHeights[i] > first) {
second = first;
secondIndex = firstIndex;
first = wallHeights[i];
firstIndex = i;
} else if (wallHeights[i] > second) {
second = wallHeights[i];
secondIndex = i;
}
} // 获取左侧墙的索引
int startIndex = Math.min(firstIndex, secondIndex);
// 获取右侧墙的索引
int endIndex = Math.max(firstIndex, secondIndex);
// 计算距离
int distance = endIndex - startIndex;
// 如果第一高的墙和第二高的墙之间至少有一堵墙,那么开始计算这两堵墙之间可以放多少个单位的水
if (distance > ) {
result = result + (distance - ) * second;
// 减去这两堵墙之间的砖数
for (int i = startIndex + ; i < endIndex; i++) {
result -= wallHeights[i];
} }
// 开始递归处理左侧墙距离开始位置能放多少水
process(start, startIndex);
// 开始递归处理右侧墙距离结束位置能放多少水
process(endIndex, end);
}
public static void main(String[] args) {
process(, wallHeights.length - );
System.out.println(result);
}
}
以前没怎么写太多算法,突然想写个结果花了一下午。┬─┬ ノ( ' - 'ノ) 摆好。(╯‵□′)╯︵┴─┴再丢一次!坑爹啊!!!自己都赶脚很坑爹了。看来以后得要多去看看一些算法思路了。
如果各位觉得还要一个C#的话,我以后会补上一个C#的。就到这,各位拜拜。
Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)的更多相关文章
- 常见排序算法(JS版)
常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...
- LeetCode 算法题解 js 版 (001 Two Sum)
LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...
- 十大经典排序算法的JS版
前言 个人博客:Damonare的个人博客 如遇到问题或有更好的优化方法,可以: 提issue给我 或是pull requests 我都会看到并处理,欢迎Star. 这世界上总存在着那么一些看似相似但 ...
- 好玩的算法(JS版)
1.字符串反转 'cba'.split('').reverse().join(''); 2.在数组最后一位添加一项 array[array.length]=(new value);
- 蓄水池采样算法(Reservoir Sampling)
蓄水池采样算法 问题描述分析 采样问题经常会被遇到,比如: 从 100000 份调查报告中抽取 1000 份进行统计. 从一本很厚的电话簿中抽取 1000 人进行姓氏统计. 从 Google 搜索 & ...
- 全排列算法的JS实现
问题描述:给定一个字符串,输出该字符串所有排列的可能.如输入“abc”,输出“abc,acb,bca,bac,cab,cba”. 虽然原理很简单,然而我还是折腾了好一会才实现这个算法……这里主要记录的 ...
- 常见算法是js实现汇总(转载)
常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...
- Twitter分布式自增ID算法snowflake原理解析
以JAVA为例 Twitter分布式自增ID算法snowflake,生成的是Long类型的id,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特(0和1). 那么一个 ...
- 【算法34】蓄水池抽样算法 (Reservoir Sampling Algorithm)
蓄水池抽样算法简介 蓄水池抽样算法随机算法的一种,用来从 N 个样本中随机选择 K 个样本,其中 N 非常大(以至于 N 个样本不能同时放入内存)或者 N 是一个未知数.其时间复杂度为 O(N),包含 ...
随机推荐
- iOS_直播类app_HTTP Live Streaming
http://www.2cto.com/kf/201606/513980.html https://developer.apple.com/library/ios/technotes/tn2224/_ ...
- Centos YUM 升级PHP
升级到5.3.3 1.删除已安装文件 yum remove php-* 2.安装 PHP 5.3 yum -y install php53* 升级到5.6 1.删除已安装文件 ...
- 51nod1174(RMQ)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1174 题意:中文题诶- 思路:RMQ模板题 关于RMQ: h ...
- CSV文件分割与列异常处理的python脚本
csv文件通常存在如下问题: 1. 文件过大(需要进行文件分割)2. 列异常(列不一致,如元数据列为10列,但csv文件有些行是11列,或者4列)本脚本用于解决此问题. #coding=utf-8 ' ...
- css雪碧图生成工具4.1更新
V4.0介绍地址:http://www.cnblogs.com/wang4517/p/4493917.html 此次更新主要针对已有BUG的修复,用户可在客户端上直接看到更新信息,自己去下载 已修复问 ...
- iphone 尺寸and字体
iPhone的APP界面一般由四个元素组成,分别是:状态栏.导航栏.主菜单栏以及中间的内容区域 这里取用 640×960 的尺寸设计,那我们就说说在这个尺寸下这些元素的尺寸: 状态栏:就是我们经常说的 ...
- PDA手持终端扫描条码开单打印一体 结合后台电脑系统 数据同步交互解决方案
PDA通过扫描商品条码移动开单,实现便携式办公,伴随式销售,PDA能通过WIFI无线局域网.GPRS互联网直接与主机连接,让公司业务人员能随时随地了解公司产品信息,直接扫描商品条码,进行开单.入库.库 ...
- iOS之 状态栏字体颜色的设置
前一段时间接手一个项目后,熟悉的过程中发现了不少问题,其中有一个就是关于状态栏的问题. 我们都知道:状态栏字体颜色在不同界面不一样的,原因是系统设置的时候把状态栏的字体颜色的界面控制器设置的yes. ...
- docker学习之二镜像创建
继上一篇docker入门之后写一点使用的经验. 通过命令:docker run -it REPOSITORY或IMAGE ID 注:-it后面跟的字段可以通过下面指令获得 创建运行的容器,会进入一 ...
- 数据库访问性能优化 Oracle
特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...