在一个升序数组中添加最少的数字,使得从1--n之间所有的数都能用数组中几个数的和表示
一个Java的笔试题上面遇到的题,当时没有做出来。
拆分:
- 序列升序
- 1--n所有的数都要能表示
- 用数组中数字的和表示
- 添加最少的数字
思路:这个要先从小的数开始表示,因为大的数可以用小数表示。
1--n是一个连续序列,有个特点是1+2+4=7,用1,2,4可以表示1--7之间的数字。1+2+4+8=15可以表示1--15之内的数字。1+2+4+8+16=31。规律很明显了,每次加上和的后一个数。
1+2+5=8能表示1--8的数字吗?答案是不能,因为1+2=3,而后面添加的是5,所以数字4不能表示。那1+2+4+4=11能够表示1--11的数吗?显然是能的。
验证:采用上述思路,每次所能表达的序列都是由前一个序列添加一个最大的数得到的,这样最后添加的数字一定是最少的。
总结:用S表示前面数字的和,同时S也代表当前能够表达的序列为1--S。从数组左边访问数组如果S>=arr[i],则S+=arr[i]。否则S+=(S+1),同时记录添加的数。S初值为0
代码实现
public class AddMinNum {
private int[] arr= {5,7,8,10,15,16,17,19,20};
private int fun(int n){
int sum=0;//开始到当前位置所有数字的和。
int num=0;//添加的数字个数。
int i=0;
while(sum<n){
if(i>=arr.length)
break;
if(sum>=arr[i]){
sum+=arr[i++];
System.out.println("sum="+sum);
}else{
int tmp=sum+1;
System.out.println("sum="+sum+" add:\t"+tmp);
sum+=tmp;
num+=1;
}
}
while(sum<n){
int tmp=sum+1;
System.out.println("sum="+sum+" add:\t"+tmp);
sum+=tmp;
num+=1;
}
return num;
}
public static void main(String[] args) {
System.out.println("n=100 => min="+new AddMinNum().fun(100));
}
}
结果

在一个升序数组中添加最少的数字,使得从1--n之间所有的数都能用数组中几个数的和表示的更多相关文章
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC 实现代码如下: using System; using System.Collections.Generi ...
- odoo xml中添加数据的数字代表含义
参考原文:https://alanhou.org/odoo12-import-export-data/ <?xml version="1.0"?> <odoo n ...
- 在jekyll模板博客中添加网易云模块
最近使用GitHub Pages + Jekyll 搭建了个人博客,作为一名重度音乐患者,博客里面可以不配图,但是不能不配音乐啊. 遂在博客里面引入了网易云模块,这里要感谢网易云的分享机制,对开发者非 ...
- RDLC中添加参数,用来显示报表中数据集之外的信息。
我添加了两个参数,首先后台: ReportParameter rp = ,,).ToString()); ReportParameter rp1 = new ReportParameter(" ...
- 在caffe中添加新的layer
比如现在要添加一个vision layer,名字叫Ly_Layer:(一般命名第一个字母大写,其余小写.) 1.属于哪个类型的layer(共五种:common_layer, data_layer, l ...
- Spring源码学习:第1步--在Spring源码中添加最简单的Demo代码
为了最大程度地贴近Spring源码并进行学习,一种比较直接的做法是:直接在Spring源码中加入Demo代码,并进行调试. 参照以前使用Spring的经验,Spring最简单的使用方法是:一个实体类. ...
- Django 向数据表中添加字段方法
在模型order中添加字段discount字段,并给予初始值0 方法: 先在models.py中修改模型 添加 discount = models.DecimalField(max_digits=8, ...
- 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)
原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...
- ArcGIS Engine中添加点、线、面元素
转自原文 ArcGIS Engine中添加点.线.面元素 此种方式为IElement的方式在axMapControl的GraphicsContainer中好绘制图形. //画点 IPoint pt = ...
随机推荐
- 【0725 | Day 1】计算机编程/计算机组成原理/计算机操作系统
什么是编程 编程语言:人与计算机交流的手段 编程:通过编程语言编写文件 学习编程的目的:让计算机代替人力,为我们服务 计算机组成原理 计算机由五大部分组成:控制器.运算器.存储器.输入设备.输出设备. ...
- Python模块之snmp-cmds,easysnmp
一.简介 snmp-cmds模块通过SNMP与目标设备进行通信,此模块适用于windows,此模块是基于系统已安装了net-snmp环境easysnmp模块通过SNMP与谬表设备进行通信,此模块用于l ...
- git 常规业务场景 使用
一般每个开发者都会有个自己的分支,有个test分支,合并代码用,两条分支相互备份,就算merge的时候被覆盖,也不用担心 建立自己的分支 // 创建本地分支, git checkout -b dev_ ...
- spring全家桶的pom的基本配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- SpringBoot:高并发下浏览量入库设计
一.背景 文章浏览量统计,low的做法是:用户每次浏览,前端会发送一个GET请求获取一篇文章详情时,会把这篇文章的浏览量+1,存进数据库里. 1.1 这么做,有几个问题: 在GET请求的业务逻辑里进行 ...
- C++责任链
#include <iostream> using namespace std; class Base{ protected: Base *next; public: Base(Base ...
- oauth2.0授权详解
学习oauth认证之前先回顾一下通过sessionid的会话过程 关于session与cookie的请戳:https://www.cnblogs.com/moran1992/p/10793748.ht ...
- Codeforces 246C
题意略. 思路: 我们将数组中的数字从大到小排列,分别考虑取前0 + 1,1 + 1,2 + 1.....个的情况. 所谓i + 1的意思是,取前i个的时候,同时取第[i + 1],[i + 2],. ...
- .gitignore不起作用,过滤规则
git 通过配置.gitignore文件忽略掉的文件或目录,在.gitignore文件中的每一行保存一个匹配的规则 # 此为注释 – 将被 Git 忽略 *.a :忽略所有 .a 结尾的文件 !lib ...
- Spring中老生常谈的FactoryBean
本文完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/factorybean Factory ...