`
ihuashao
  • 浏览: 4557776 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

几个典型问题的求解

F# 
阅读更多

1. 如何将整形数转化到对应的字节数组中。

都知道字节是8位的,而Java中整形,也就是int型的变量是32位的,因此这个”对应“也就是要保存到长度为4的字节数组中。那么下面来考虑如何转换。看代码:

public class IntToByte {
public static void main(String args[]){
int a = 1000;
byte[] byteArray = new byte[4];

for (int i=0; i<4; i++){
byteArray[i] = new Integer(a & 0xFF).byteValue();
a >>= 8;
System.out.println(byteArray[i]);
}
}
}

2. 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。 如f(13)=6, 因为1,2,3,4,5,6,7,8,9,10,11,12,13.数数1的个数,正好是6.

当然了,我想看到这个问题的时候,大家第一反应肯定是用replaceAll()这个方法,但是代码写出来后,测试一下,你会发现当n=100w的时候,速度就有点跟不上了,因为实现replaceAll()方法的时候,也必不可少的牵扯都遍历匹配和字符串的连接。这个时候就要去寻找一种相对高效的方法。

一种办法就是用数学的办法,试图推导出一个关系式,来计算这个函数。这里我贴出一个网友的解法和代码:

对于N=10^n-1 (0、9、99、999……)来说
设F(n)=f(10^n-1)
F(n)=A(n)+B(n)
A(n)表示由最高位带来的1的个数
B(n)表示由非最高位带来的1的个数
那么,易得A(n)=10^n,
B(n)=10*F(n-1) (n>0)
B(0)=0
综上所述,F(n)=F(n-1)+10^n=n*10^(n-1)

而对任意正整数N=a*10^n+b
其中a为N的最高位数(1-9)
那么,f(N)中由最高位带来的1的个数C(N)=a>1 ? 10^n : b+1
而非最高位来带的1的个数D(N)=f(b)+a*F(n)
其中f(b)为[a*10^n,a*10^n+b]中的个数
aF(n)为[0,a*10^n]中的个数

所以,f(N)=f(b)+aF(n)+(a>1 ? 10^n : b+1)
=f(b)+an*10^(n-1) + (a>1 ? 10^n : b+1)

代码:

public class GoogleTest {

private static final int[] tenSqr = new int[]{1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
};
// 获取a的位数

private static int get_n(int a){
int n = 0
;

while (tenSqr[n] <= a) n++;
return n-1
;
}

private static int f(int N){
if (N == 0)

return 0;
else if (N < 10)

return 1;

int n = get_n(N);
int a = N /
tenSqr[n];
int b = N % tenSqr[n];

return f(b) + a * n * tenSqr[n-1] + (a > 1 ? tenSqr[n] : b+1);
}

public static void main(String[] args) {
for (int i = 1; i < 1000; ++
i)
System.out.println("f(" + i + ")=" +
f(i));
}
}

这种解法最直接的好处就是把复杂度化简到了分析中,分析之后的结果再由计算机去处理,效率提高很多。下面我想讲讲我的想法,以为一个数的大小,是由他位数和各个位置上的数字大小决定的,再具体化一下,可以把一个数看成2部分,最高位和除去最高位之后的数。举个例子:148,那么可以肯定的说这个S = f(148)的值和最高位的1,以及48有着直接的关系。我的分析就是如果最高位1,那么这个S(初始是0)的值现在就可以变成48+1了,因为100-148有49个1,然后再去递归分析48这个数,分析完之后再分析148-48-1这个数的情况;如果最高位不是1,那么就应该分析去除最高位之后的那个数的情况。好了,贴代码:

public class Cound {
static int number = 0;


public static int count2(int n){
String str = "" + n;

if (n == 0)
number += 0;
else if (n <= 9 && n > 0)
number ++;
else if (n >= 10){
String temp = str.substring(1);
nt tempInt = Integer.parseInt(temp);

if (str.charAt(0) == '1')
number += tempInt + 1;

count2 (tempInt);

n -= tempInt + 1;

count2(n);
}
return number;
}


public static void main(String args[]){
int i = 1000000;

long time2 = System.currentTimeMillis();
System.out.print(count2(i) +" ");
System.out.println(System.currentTimeMillis()-time2);
}
}

后记:当然了,还是推荐第一种解法,分析的最优结果就是能将这个问题的复杂度降到O(1),当然这是理论的情况,能不能,值不值得还是需要具体问题具体分析的。当然也可以寻求别的解法,如同我做的那样。

分享到:
评论

相关推荐

    图论中几个典型问题的求解.ppt

    图论中几个典型问题的求解.ppt

    图论中几个典型问题的求解

    文档阐述了最短路,TSP问题,中国邮路问题及其算法

    论文研究-一种求解复杂多峰问题的新型粒子群优化算法研究.pdf

    为提升标准粒子群算法在求解多峰复杂问题时收敛速度慢和极易陷入局部最...对三个典型测试函数进行仿真实验, 所得结果表明CLPSO-HC相比其他几种算法有较好的收敛性。因此, CLPSO-HC可以作为求解复杂多峰问题的有效算法。

    粒子群优化算法及其在SAT问题matlab源码

    由于SAT问题是一种典型的多模式问题,也就是说一个SAT问题一般会有有多个解,正如前文所说,PSO算法并不适合解决多模式问题,所以为了使BPSO能够求解多模式问题,按下面的方式修改BPSO:当BPSO中某个粒子找到一个可...

    PSO算法求解PFSP问题研究进展 (2012年)

    粒子群优化算法作为一种基于...然后从粒子群算法涉及到的初始化种群的方法、粒子编码方法、目标函数设计和粒子速度及位置更新公式等几个主要问题的角度对近年来比较典型的用粒子群算法求解置换流水车间调度问题进行了总

    论文研究-求解函数优化的新型差异演化算法.pdf

    针对差异演化算法存在早熟收敛和后期求解效率低的缺点,提出一种新型差异演化算法。该算法基于单种群,在演化...对几个典型的测试函数进行仿真实验表明,该算法能够有效避免早熟收敛,改善了差异演化算法的优化性能。

    人工智能中的搜索问题.pptx

    几个典型的搜索问题 起始状态:Arad 路径规划问题 目标状态:Bucharest 合法行动与后继的确定性: 与某一城市相邻的城市才能成为合法后继 状态空间的离散性: 城市是离散的 环境的静态性: 城市的相对位置不会改变 ...

    论文研究-的设置在求解函数优化中的影响.pdf

    交叉熵方法(Cross Entropy)是近几年发展而来的一种启发式方法,在求解组合优化问题中显示出其简单有效的特点,将运用交叉熵方法(CE)寻求图论中一个典型的NP困难问题—最大割问题的最优解。为了解决最大割问题,...

    求解非线性方程组的混合遗传算法 (2005年)

    非线性方程组的求解是数值计算领域中最困难的问题,大多数的数值求解算法例如牛顿法的收敛性和性能特征在很大程度上依赖于初始点。但是对于很多非线性方程组,选择好的...选择了几个典型非线性方程组,从收敛可靠性、计

    论文研究-混沌大洪水算法求解函数优化问题.pdf

    针对函数优化问题,提出一种混沌大洪水混合优化算法。...算法在Delphi 7环境下编程实现,针对几个典型复杂函数进行优化测试。仿真结果表明,混沌大洪水算法是一种简单有效的算法,在运行效率上明显优于其他算法。

    论文研究-一类带约束动态多目标优化问题的进化算法.pdf

    动态多目标约束优化问题是一类NP-Hard问题,定义...通过几个典型的Benchmark函数对算法的性能进行了测试,其结果表明新算法能够较好地求出带约束动态多目标优化问题在不同环境下质量较好、分布较均匀的Pareto最优解集。

    ANSYS CFX流体分析及仿真

    本书以CFX13.0为蓝本,由浅入深、循序渐进地介绍了CFX的使用方法,包括CFX的基本理论与方法、ICEM CFD网格生成、CFX前处理、CFX求解、CFX后处理等功能的介绍,并通过几个典型的CFX实例详细介绍CFX从网格划分到模型...

    ANSYS基本过程手册

    1.1 完成典型的ANSYS分析 1 1.2 建立模型 1 第2章 加 载 23 2.1 载荷概述 23 2.2 什么是载荷 23 2.3 载荷步、子步和平衡迭代 24 2.4 跟踪中时间的作用 25 2.5 阶跃载荷与坡道载荷 26 2.6 如何加载 27 2.7 如何指定...

    组合数学及其算法

    6.2 几个典型的递归关系.. 6.3 用母函数方法求解递归关系 6.4 常系数线性齐次递归关系的求解 6.5 常系数线性非齐次递归关系的求解 6.6 非常系数非线性递归关系的求解 6.7 差分表法 6.8 stirling数 习 ...

    人工智能的研究内容.docx

    启发式知识常由启发式函数来表示,启发式知识利用得越充分,求解问题的搜索空间就越小。典型的启发式搜索方法有A*、AO*算法等。近几年搜索方法研究开始注意那些具有百万节点的超大规模的搜索问题。 5)机器学习是...

    电磁波模拟- 更容易编写脚本、后处理和现场导出 模拟 fdtd 蟒蛇meep 超材料 光子晶体 时域 频域 电 Python

    为了演示如何使用它们来简化模拟设置,我在这些模块中附带了几个针对各种典型问题的即用型模拟。我相信所呈现的脚本对于任何研究光子晶体、超材料、集成光子学和纳米光子学、腔谐振器、波导等的人来说都是一个很好的...

    java运算笔试题-yices2:YicesSMT求解器

    这里有几个典型的小例子,说明了使用 . 线性实数算法 ; ; QF_LRA = Quantifier-Free Linear Real Arithmetic ( set-logic QF_LRA) ; ; Declare variables x, y ( declare-fun x () Real ) ( declare-fun y () Real )...

    论文研究-带有高斯变异的混合蛙跳蝙蝠算法.pdf

    选取几个典型函数进行测试,结果显示,SFLBAWGM的优化性能有了显著提高,即具有较快的收敛速度、较高的寻优精度、收敛稳定性和收敛可靠性,验证了SFLBAWGM的有效性和优越性,并且在高维函数上的优势更为明显,适合...

    离散Jaya算法的复杂网络社区发现

    社区结构是复杂网络的重要特性之一, 基于模块度的复杂网络社区发现... 实验表明, 在几个典型真实网络实例和一类人造网络实例上, 与几个经典算法和元启发式算法相比, 本文算法具有求解精度高、能自动确定社区数目等优点.

    Java分治归并排序算法实例详解

    这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 分治模式在每层递归时都有三个步骤: (1)分解原问题为...

Global site tag (gtag.js) - Google Analytics