一个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之间所有的数都能用数组中几个数的和表示的更多相关文章

  1. C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。

    添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC 实现代码如下: using System; using System.Collections.Generi ...

  2. odoo xml中添加数据的数字代表含义

    参考原文:https://alanhou.org/odoo12-import-export-data/ <?xml version="1.0"?> <odoo n ...

  3. 在jekyll模板博客中添加网易云模块

    最近使用GitHub Pages + Jekyll 搭建了个人博客,作为一名重度音乐患者,博客里面可以不配图,但是不能不配音乐啊. 遂在博客里面引入了网易云模块,这里要感谢网易云的分享机制,对开发者非 ...

  4. RDLC中添加参数,用来显示报表中数据集之外的信息。

    我添加了两个参数,首先后台: ReportParameter rp = ,,).ToString()); ReportParameter rp1 = new ReportParameter(" ...

  5. 在caffe中添加新的layer

    比如现在要添加一个vision layer,名字叫Ly_Layer:(一般命名第一个字母大写,其余小写.) 1.属于哪个类型的layer(共五种:common_layer, data_layer, l ...

  6. Spring源码学习:第1步--在Spring源码中添加最简单的Demo代码

    为了最大程度地贴近Spring源码并进行学习,一种比较直接的做法是:直接在Spring源码中加入Demo代码,并进行调试. 参照以前使用Spring的经验,Spring最简单的使用方法是:一个实体类. ...

  7. Django 向数据表中添加字段方法

    在模型order中添加字段discount字段,并给予初始值0 方法: 先在models.py中修改模型 添加 discount = models.DecimalField(max_digits=8, ...

  8. 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)

    原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...

  9. ArcGIS Engine中添加点、线、面元素

    转自原文 ArcGIS Engine中添加点.线.面元素 此种方式为IElement的方式在axMapControl的GraphicsContainer中好绘制图形. //画点 IPoint pt = ...

随机推荐

  1. Spring入门(七):Spring Profile使用讲解

    1. 使用场景 在日常的开发工作中,我们经常需要将程序部署到不同的环境,比如Dev开发环境,QA测试环境,Prod生产环境,这些环境下的一些配置肯定是不一样的,比如数据库配置,Redis配置,Rabb ...

  2. 帝国CMS(EmpireCMS) v7.5后台任意代码执行

    帝国CMS(EmpireCMS) v7.5后台任意代码执行 一.漏洞描述 EmpireCMS 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行. 二 ...

  3. K8S搭建-1 Master 2 Workers(dashboard+ingress)

    本文讲述k8s最新版的搭建(v1.15.2) 分如下几个topic步骤: 各个节点的基本配置 master节点的构建 worker节点的构建 安装dashboard 安装ingress 常见命令 do ...

  4. mybatis基础简介

    1.mybatis的加载过程? 程序首先加载mybatis-config.xml文件,根据配置文件创建SQLSessionFactory对象:    然后通过SQLSessionFactory对象创建 ...

  5. spring-boot-plus V1.2.1 发布 文件上传下载和静态资源访问

    [V1.2.1-RELEASE] 2019.08.21 ⭐️ New Features 文件上传保存到服务器指定目录 文件下载 访问上传的图片等资源 启用项目静态资源访问,可访问static/temp ...

  6. 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

    Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化,以支持更多实用的功能. 另外IOS的Hybrid App也完成 ...

  7. 使用CodeBenchmark对逻辑代码进行并发测试

    一直对性能测试比较感兴趣,所以也写了不少的测试工具有WebApiBenchmark和TcpBenchmark等;但这些工具测试都是有针对性和配置的方式来进行功能有限所以很难适用更多的场景,所以单独开发 ...

  8. centos7配置JDK

    CentOS7自带jdk1.8 查看当前系统jdk的版本:java -version 列举匹配已安装的java的软件包:yum list installed | grep java 卸载安装的jdk: ...

  9. HDU 6040

    题意略. 思路:题目就是在询问你m次,第k小是哪个数.首先我们可以想到直接排序后,即可O(1)来查找询问.但是题目中n的范围给的是1e7, 无法承受nlogn的复杂度.从而想到另外一种求静态第k小的方 ...

  10. 【凭据不工作】Win远程桌面提示您的凭据不工作

    1.浏览器直接进入云服务器 2.打开运行 --输入gpedit.msc--计算机配置--管理模板--windows组件--远程桌面服务--远程桌面会话主机--安全--远程(RDP)链接要求使用制定的安 ...