算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
如果说:
给定一个号码与通配符问号W,问号代表一个随机数字。
给定的整数,得到X,和W它具有相同的长度。
问:多少整数协议W的形式和的比率X大?
进格公式
数据的多组,两排各数据的,W,第二行是X。它们长度同样。在[1..10]之间.
输出格式
每行一个整数表示结果。
答题说明
输入例子
36?
1?
8
236428
8?
3
910
?
5
输出例子
100
0
4
分析例如以下:
先用穷举法来分析几种可能情况
1.
36?1?
8
236428
假设W第一个通配符之前的数字大于X,则通通配符能够是随意数字。因此W比X大的个数就是10的n次方(通配符个数n)
2.
8?3
910
假设W第一个通配符之前的数字小于x,则W不可能比X大,结果为0
3.
2?
25
假设W第一个通配符之前的数字等于x。这时,仅仅有W的通配符比X对应位置的数字大的情况,才有可能使w比X大。因此通配符前面的数字不起不论什么作用,
我们能够把它简化为
?
5
此时能够得到结果为4
分析完了第一个通配符我们来分析第二个通配符,这时我们发现,仅仅有第一个通配符前面没有数字或数字和x相等的情况下。我们才须要考虑第二个通配符。
而且情况非常相似。仅仅有第一个通配符和x同样位置中的数字相等的情况,我们才须要对第二个通配符进行分析,
否则。跟上面的情况类似,
假设第一个通配符大于x中的数字,则W比X大的个数就是10的n-1次方(通配符个数n)
假设第一个通配符小于x中的数字。则W比X大的个数就是0
以此类推。就能够得出W比X大总个数
c#演示样例代码例如以下:
/// <summary>
/// 使用算法推算w大于x的个数
/// </summary>
/// <param name="string_W"></param>
/// <param name="string_X"></param>
/// <returns></returns>
private int getNum(string string_W, string string_X)
{
if (int.Parse(string_W.Replace('? ', '9')) <= int.Parse(string_X))
{
return 0;
} int firstCharIndex = -1;//第一个通配符的索引
int secondCharIndex = -1;//第二个通配符的索引
int value_x = 0;////字符串string_X中在第一个通配符对应位置的数字的值
int charCount = 0;//通配符数量 //找到第一个通配符的索引和第二个通配符的索引
for (int i = 0; i < string_W.Length; i++)
{
if (string_W[i] == '? ')
{
charCount++; if (firstCharIndex == -1)
{
value_x = int.Parse(string_X[i].ToString());
firstCharIndex = i;
continue;
}
if (firstCharIndex != -1 && secondCharIndex == -1)
{
secondCharIndex = i;
}
}
}
//第一个通配符前面有数字,而且与x不相等的情况
if (firstCharIndex > 0)
{
int formerValue_W = int.Parse(string_W.Substring(0, firstCharIndex));
int formerValue_X = int.Parse(string_X.Substring(0, firstCharIndex));
if (formerValue_W > formerValue_X)
{
//假设之前的数据W>X,则=通配符的个数n 10的n次方
return (int)Math.Pow(10, charCount);
}
else if (formerValue_W < formerValue_X)
{
return 0;
}
} //假设第一个通配符之前的数相等或没有数字,推断通配符和X字符的大小情况
if (charCount > 1)
{
//递归计算出结果 第一个通配符大于x的情况+等于x时进行递归推算
return (9 - value_x) * (int)Math.Pow(10, charCount - 1) +
getNum(string_W.Substring(firstCharIndex + 1), string_X.Substring(firstCharIndex + 1));
}
else
{
//仅仅有一个通配符。推断当通配符与x同样位置的整数同样时。w和x的大小
int W = int.Parse(string_W.Replace('? ', string_X[firstCharIndex]));
int X = int.Parse(string_X);
if (W > X)
{
return (9 - value_x) + 1;
}
else
{
return (9 - value_x);
}
}
}
/// <summary>
/// 使用常规逻辑遍历计算w大于x的个数
/// </summary>
/// <param name="string_W"></param>
/// <param name="string_X"></param>
/// <returns></returns>
private int CalNum(string string_W, string string_X)
{
int value_x = int.Parse(string_X); string[] parms_w = string_W.Split('? '); string[] charDic = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "l", "m" };//最多10个
//字符字典。用于依次替换string_W中的通配符,以方便递归方法中的遍历
string_W = ""; for (int i = 0; i < parms_w.Length; i++)
{
string_W += parms_w[i] + charDic[i];
}
string_W = string_W.Substring (0,string_W .Length -1);
int charCount = parms_w.Length - 1; return CalNum_sub(string_W, value_x, charDic, charCount); ;
}
/// <summary>
/// CalNum方法中用到的递归计算
/// </summary>
/// <param name="string_W"></param>
/// <param name="value_x"></param>
/// <param name="charDic"></param>
/// <param name="charCount"></param>
/// <returns></returns>
private int CalNum_sub(string string_W, int value_x, string[] charDic, int charCount)
{
int total = 0; for (int k = 0; k < 10; k++)
{
string temp = string_W.Replace(charDic[charCount - 1], k.ToString());
if (charCount > 1)
{
total += CalNum_sub(temp, value_x, charDic, charCount - 1);
}
else
{
if (int.Parse(temp) > value_x)
{
total++;
}
}
}
return total;
} /// <summary>
/// 測试方法
/// </summary>
/// <param name="string_W"></param>
/// <param name="string_X"></param>
/// <returns></returns>
private string testNum(string string_W, string string_X)
{
Stopwatch watch = new Stopwatch();
watch.Start();
int v1 = CalNum(string_W, string_X);
watch.Stop();
string t1 = watch.ElapsedTicks.ToString();
watch.Reset();
watch.Start();
int v2 = getNum(string_W, string_X);
watch.Stop();
string t2 = watch.ElapsedTicks.ToString();
return (v1 + "--" + v2 + "\r\n" + t1 + "--" + t2).ToString();
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?的更多相关文章
- 能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法。尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。
能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法.尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis.MemCa ...
- CentOS的利手:“Screen”一个可以在多个进程之间多路复用一个物理终端的窗口管理器
你是不是经常需要远程登录到Linux服务器?你是不是经常为一些长时间运行的任务头疼?还在用 nohup 吗?那 么来看看 screen 吧,它会给你一个惊喜! 你是不是经常需要 SSH 或者 tele ...
- 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记》[转]
转载地址:http://bbs.chinaunix.net/archiver/tid-1823500.html 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 ...
- 【niubi-job——一个分布式的任务调度框架】----如何开发一个niubi-job的定时任务
引言 上篇文章LZ主要讲解了niubi-job如何安装,如果看过上一篇文章的话,大家应该知道,niubi-job执行的任务是需要用户自己上传jar包的. 那么问题来了,这个jar包如何产生?有没有要求 ...
- Java学习者的建议:把自己从一个疯狂下载者&资料的奴隶变成一个真正的学习者
Java学习者的建议:把自己从一个疯狂下载者&资料的奴隶变成一个真正的学习者 你下载的资料看过了多少,请大家好好想想,然后回答一下很多人为了The.Economist花了不少时间,为了下载一个 ...
- [转]RegExp 构造函数创建了一个正则表达式对象,用于将文本与一个模式匹配
本文转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp RegExp ...
- JAVA代码:生成一个集合,自定义大小,100以内的随机整数
JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...
- Java初学者作业——实现控制台的猜数字游戏。游戏运行时产生一个1~100之间的随机数字
返回本章节 返回作业目录 需求说明: (1)实现控制台的猜数字游戏.游戏运行时产生一个1-100之间的随机数字 (2)要求用户从控制台输入数字,若输入的数字比随机数小,则输出"太小了,再大一 ...
- Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL
没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...
随机推荐
- 访问祖先类的虚方法(直接访问祖先类的VMT,但是这种方法在新版本中未必可靠)
访问祖先类的虚方法 问题提出 在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法. 举个例子,假设有三个类,实现如下: t ...
- 使用git微命令深入理解git工作机制
首先.这篇不是真正意义上的翻译,所以大家在看的时候不要找相应的英文文章相应着看.这篇文章之所以归类为翻译.是由于最開始有一篇英文文章让我对git内部机制有了清楚的认识,它能够说是我git的启蒙老师吧. ...
- Selenium来抓取动态加载的页面
一般的爬虫都是直接使用http协议,下载指定url的html内容,并对内容进行分析和抽取.在我写的爬虫框架webmagic里也使用了HttpClient来完成这样的任务. 但是有些页面是通过js以及a ...
- Android架构设计和软硬整合完整训练
Android架构设计和软硬整合完整训练 Android架构设计和软硬整合完整训练:HAL&Framework&Native Service&Android Service&a ...
- 201215-03-19---cocos2dx内存管理--具体解释
因为cocos2dx我们的使用c++写的,所以内存管理就是一个绕只是去的坎,这个你不懂内存仅仅懂业务逻辑的话,还玩什么c++,今天看了半天这个东西,事实上本质上是理解的,可是就是有一个过不去的坎,最终 ...
- 方案猿身高project联赛,艺术家,相反,养殖场!-------三笔
已经看到了程序猿在电影中都是非常厉害的人物,硬道理键盘噼里啪啦后,奇妙的事情会发生. 当我报了这个专业,開始认真的写程序,在这个领域学习的时候,却发现非常多干这一行 的都自称"码农" ...
- android4.3环境搭建
方案一: 首先android环境搭建有如下几个东西是必须准备的: 1. Eclipse (下载地址:http://www.eclipse.org/downloads/,建议至少3.4及以上版本) 2 ...
- 该项目的建设maven片:4.协调和依赖,spring依赖注入demo
源码下载 协调 <groupId>com.demo.animal</groupId> <artifactId>animal-core</artifactId& ...
- ExtJs 设置GridPanel表格文本垂直居中
业务场景,需要实现最终效果图如下: GridPanel代码如下配置: { xtype : 'grid', id : 'grid_jglb', frame : true, region : 'cente ...
- SESC中的热量模拟器
SESC安装见前文 配置sesc支持热量模拟 ../sesc/configure --enable-power --enable-therm make 遇到问题: 1 找不到 liblevmar.a ...