`
ihuashao
  • 浏览: 4720584 次
  • 性别: 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),当然这是理论的情况,能不能,值不值得还是需要具体问题具体分析的。当然也可以寻求别的解法,如同我做的那样。

分享到:
评论

相关推荐

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

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

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

    总的来说,图论中的典型问题及其求解方法如最短路问题,不仅在理论上有重要的研究价值,而且在实际应用中具有广泛的实用性。理解和掌握这些概念及算法,对于解决复杂网络中的路径优化、流量分配等问题至关重要。

    求解这几个问题,几个递归算法中的问题,挺有意思的。

    经典的回溯问题有八皇后问题、数独求解等。递归在回溯法中用于表示当前状态和回溯到上一个状态。 6. **概述**:递归算法的共同特点是解决问题时自顶向下地分解问题,通过解决子问题逐步逼近原问题的解。理解递归的...

    基于遗传算法的TSP问题求解

    TSP问题具有以下几个显著特点: 1. **NP完全性**:TSP问题是典型的NP完全问题,当城市数量增加时,问题规模呈指数增长,传统方法难以找到最优解。 2. **广泛的应用场景**:TSP问题不仅存在于物流配送、线路规划等...

    基于MATLAB的机械工程控制问题的求解与仿真

    在实例计算部分,本文描述了如何利用MATLAB及其Simulink工具箱求解和仿真一个典型的机械工程控制问题。文章中提到的开环系统的传递函数为\( \frac{1}{s^2 + 2\zeta s} \),并探讨了阻尼比\( \zeta \)变化对闭环系统...

    基于遗传算法求解TSP问题.pdf

    利用遗传算法求解TSP问题的实验通常包括以下几个部分: 1. 实验内容:通过遗传算法对TSP问题进行求解,了解算法原理,掌握算法的实现过程。 2. 实验目的:加深对遗传算法的理解,通过实际编程实现对TSP问题的求解...

    圆形磁场中的几个典型问题.doc

    以下是对标题和描述中提到的几个典型问题的详细解析: 一、最值问题 1. 最长时间问题: 在例1中,粒子在磁场中的运动时间取决于它的入射角度。当粒子的轨迹恰好覆盖整个磁场区域,即形成一个直径穿越磁场的圆时,...

    《C++数据结构原理与经典问题求解》的配套源代码

    在本书中,你可能会遇到以下几种典型的数据结构: 1. **数组**:基础的数据结构,用于存储同类型元素的集合。C++中的数组可以直接访问任意位置的元素,但插入和删除操作效率较低。 2. **链表**:包括单链表和双链表...

    八数码问题(8皇后问题)的A*算法求解(Python实现)

    这是一个典型的组合优化问题,具有高度的非线性和复杂性。 **A*算法** A*算法是一种启发式搜索算法,它结合了Dijkstra算法的最短路径寻找和最佳优先搜索的特点。A*算法通过引入一个评估函数f(n) = g(n) + h(n),...

    MATLAB优化算法实战应用案例-基于Hopfield的TSP求解

    旅行商问题(TSP)是一个典型的图论问题,其目标是在遍历所有城市一次并返回起点的情况下,找到最短的路径。这个问题在物流、计算机科学、数学等领域都有广泛的应用。由于TSP的复杂性,传统的精确算法在面对大规模...

    【路径规划-VRP问题】基于遗传算法求解单配送中心多客户多车辆最短路径规划问题含Matlab源码.zip

    特别是在车辆路线规划问题(Vehicle Routing Problem, VRP)中,如何有效地分配多辆车辆,使得它们从单一配送中心出发,服务多个客户,并返回配送中心,同时使得总行驶距离最短,这是一个典型的组合优化问题。...

    TSP问题及LINGO求解技巧

    这是个典型的求解最短路径的问题,但复杂性在于必须遍历所有城市且仅遍历一次。 几十年来,研究者发展了许多近似算法来解决TSP,包括近邻法、贪心算法、最近插入法、最远插入法、模拟退火算法和遗传算法等。这些...

    BVP_CDM_lowtqj_Thomas!_中心化差分法求解两点边值问题_源码

    在压缩包中的文件中,我们可以看到以下几个关键的脚本: 1. **CDM_main.m**:这是主程序,它调用了其他函数,执行整个求解过程。 2. **Thomas.m**:实现了Thomas算法的函数,用于求解由中心化差分法得到的三对角线性...

    用JAVA实现的布线问题求解

    Java实现布线问题求解时,可以采用以下几种算法: 1. **贪心算法**:贪心策略是在每一步选择局部最优解,期望最终得到全局最优解。例如,每次尝试连接最近的未连接节点。虽然贪心算法在某些情况下可能无法得到最优...

    NP难问题求解综述.docx

    为了更好地理解NP难问题,我们需要先定义几个基本概念: - **确定性算法**:这是一种在每一步操作中只有唯一确定选择的算法。例如,排序算法就是一个典型的确定性算法。 - **非确定性算法**:这种算法的工作方式...

    FEM/简单矩形椭圆边值问题求解总结/matlab

    2. **椭圆边值问题**:这是数学和物理中的一个典型问题,涉及到求解满足特定边界条件的椭圆型偏微分方程。这类问题广泛出现在流体力学、热传导、弹性力学等领域。 3. **MATLAB**:MATLAB是一种强大的数学计算软件,...

    文档基于遗传算法的旅行商问题求解采用MATLAB对TSP问题进行基于遗传算法的求解

    未来的研究方向可以从以下几个方面展开: 1. **多目标优化**:实际应用中,可能还存在其他约束条件或优化目标,例如时间窗限制、成本最小化等,可以考虑采用多目标遗传算法进行综合优化。 2. **并行计算**:随着...

    数据结构课程设计单循环赛中选手胜负序列求解问题

    这是一个典型的图论问题,与实际的体育赛事排名规则紧密相关,比如篮球比赛或围棋比赛的积分制。 首先,我们要理解单循环赛的规则。在单循环赛中,每个参赛者都要与其他所有参赛者进行一次比赛,每场比赛的结果只有...

    数学建模典型模型和算法程序.rar

    它通过线性变换找到数据的主要变异方向,将高维数据转换为少数几个主成分,同时保留大部分信息。 2. **整数规划**:在优化问题中,整数规划要求决策变量取整数值,广泛应用于资源配置、生产计划等领域。解决整数...

    迷宫求解 java语言实现.docx

    在迷宫求解中,我们需要考虑以下几个方面: 1. 选题理由:为什么选择迷宫求解作为课程设计的主题?迷宫求解是计算机科学中一个经典的问题,它可以应用于各种领域,同时也可以锻炼学生的算法和编程能力。 2. 基本...

Global site tag (gtag.js) - Google Analytics