`
daojin
  • 浏览: 689491 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Android面试题目之二:整形转换为字符串

阅读更多

整形转换为字符串,写了五种算法,并进行了性能分析:

1. 算法: 直接先求得长度,然后从左向右求得各位的大小

	private static class Int2String1 implements Int2String {
		public String int2String(int intValue) {
			if (intValue == 0) {
				return "0";
			}
			int length = 0;
			boolean sign = false;
			if (intValue < 0) {
				intValue = -intValue;
				sign = true;
				length++;
			}
			int k = 1;
			while (true) {
				if (intValue >= k) {
					length++;
					k = k * 10;
				} else {
					break;
				}
			}

			char[] holder = new char[length];
			int start = 0;
			if (sign) {
				holder[0] = '-';
				start = 1;
			}

			for (; start < length; ++start) {
				int count = (length - start - 1);
				int pow10 = 1;
				for (int i = 0; i < count; i++) {
					pow10 = pow10 * 10;
				}
				holder[start] = (char) ((intValue / Math.pow(10, count)) + '0');
				intValue = intValue % pow10;
			}
			return new String(holder);
		}
	}

 打印时间:

1the time is 12122, strValue = -100121312

 

2. 算法: 直接从右向左, 或者说低位到高位进行逐个插入。最后插入符号位

	private static class Int2String2 implements Int2String {
		public String int2String(int intValue) {
			char[] str = new char[0];
			boolean sign = false;
			if (intValue == 0) {
				return "0";
			}
			if (intValue < 0) {
				sign = true;
				intValue = -intValue;
			}
			while (true) {
				int leftValue = intValue % 10;
				char additionalChar = (char) (leftValue + '0');
				char[] old = str;
				str = new char[str.length + 1];
				str[0] = additionalChar;
				for (int i = 1; i < str.length; ++i) {
					str[i] = old[i - 1];
				}
				intValue = intValue / 10;
				if (intValue == 0) {
					break;
				}
			}
			if (sign) {
				char[] old = str;
				str = new char[str.length + 1];
				str[0] = '-';
				for (int i = 1; i < str.length; ++i) {
					str[i] = old[i - 1];
				}
			}
			return new String(str);
		}
	}

 打印时间:

 

1the time is 3426, strValue = -100121312

 

3.算法:先斤算长度,计算长度时与10的倍数比较。再从右向左进行运算各位的值。

	private static class Int2String3 implements Int2String {
		public String int2String(int intValue) {
			if (intValue == 0) {
				return "0";
			}
			int length = 0;
			boolean sign = false;
			if (intValue < 0) {
				intValue = -intValue;
				sign = true;
				length++;
			}
			int k = 1;
			while (true) {
				if (intValue >= k) {
					length++;
					k = k * 10;
				} else {
					break;
				}
			}
			char[] holder = new char[length];
			int start = 0;
			if (sign) {
				holder[0] = '-';
				start = 1;
			}
			for (int i = length - 1; i >= start; --i) {
				holder[i] = (char) ((intValue % 10) + '0');
				intValue = intValue / 10;
			}
			return new String(holder);
		}
	}

 打印时间:

 1the time is 834, strValue = -100121312

 

4. 先斤算长度,再从右向左进行运算各位的值。计算长度采用除法求模。

	private static class Int2String4 implements Int2String {
		public String int2String(int intValue) {
			int length = 0;
			boolean sign = false;
			if (intValue < 0) {
				sign = true;
				intValue = -intValue;
			}
			int k = intValue;
			while (k >= 0) {
				length++;
				k = k / 10;
				if (k == 0) {
					break;
				}
			}
			char[] charArray;
			if (sign) {
				length = length + 1;
				charArray = new char[length];
				charArray[0] = '-';
			} else {
				charArray = new char[length];
			}
			int m = intValue;
			int index = length - 1;
			while (true) {
				int leftValue = m % 10;
				charArray[index] = (char) (leftValue + '0');
				index--;
				m = m / 10;
				if (m == 0) {
					break;
				}
			}
			return new String(charArray);
		}
	}

 打印时间:

1the time is 1102, strValue = -100121312

 

5. 不再计算长度,而是采用一个buffer。最后构造字符串直接使用此buffer构造。由于10进制的位数一定是小于8进制的位数。32位int转换到8进制就是11位,推断10进制的最大位数也是11位。

	private static class Int2String5 implements Int2String {
		public String int2String(int intValue) {
			int position = 10;
			char[] buf = new char[11];
			if (intValue < 0) {
				intValue = -intValue;
				buf[0] = '-';
			}
			while (true) {
				int leftValue = intValue % 10;
				buf[position] = (char) (leftValue + '0');
				intValue = intValue / 10;
				if (intValue == 0) {
					break;
				} else {
					position--;
				}
			}
			return new String(buf, position, buf.length - position);
		}
	}

打印时间:

 

1the time is 742, strValue = 100121312

 

6. 采用系统自带的算法

	private static class Int2String6 implements Int2String {
		public String int2String(int intValue) {
			return String.valueOf(intValue);
		}
	}

 

打印时间:

 

1the time is 764, strValue = -100121312

 

由此可见java SDK 提供的算法并不是最优算法。采用buffer避免计算长度的算法速度更快。可以在系统内存要求不高的时候直接提供一个公用的11位的buffer去做转换可能比java系统自带的算法更快。

 

于是得到了以下算法

	public static char[] buf = new char[11];
	private static class Int2String7 implements Int2String {
		public String int2String(int intValue) {
			int position = 10;
			if (intValue < 0) {
				intValue = -intValue;
				buf[0] = '-';
			}
			while (true) {
				int leftValue = intValue % 10;
				buf[position] = (char) (leftValue + '0');
				intValue = intValue / 10;
				if (intValue == 0) {
					break;
				} else {
					position--;
				}
			}
			return new String(buf, position, buf.length - position);
		}
	}

 打印:

 

1the time is 636, strValue = 100121312

 

可是此算法有个很大的问题,就是在多线程环境下的同步问题,于是解决同步问题,于是有了算法7.

7. 在6的基础上解决同步问题:

	public static char[] buf = new char[11];
	private static class Int2String7 implements Int2String {
		public synchronized String int2String(int intValue) {
			int position = 10;
			if (intValue < 0) {
				intValue = -intValue;
				buf[0] = '-';
			}
			while (true) {
				int leftValue = intValue % 10;
				buf[position] = (char) (leftValue + '0');
				intValue = (intValue >>1)/5;
				if (intValue == 0) {
					break;
				} else {
					position--;
				}
			}
			return new String(buf, position, buf.length - position);
		}
	}

打印:

 

1the time is 616, strValue = 100121312

 

总结 :

整形转字符串,减少循环次数可以很明显提升运算速度。乘法运算比除法运算效率更高。尽量使用乘法代替除法。

 

如果您看了有收获,那么下载一个APl软件支持一下博主吧!还可以解决您的密码太多记不住的烦恼哦。

源码下载链接:

http://a.app.qq.com/o/simple.jsp?pkgname=com.wa505.kf.epassword

 

 

0
0
分享到:
评论

相关推荐

    android字符串和16进制转换

    在这里,`String.format()`和`BigInteger`用于将字符串转换为16进制,而`Base64.getDecoder().decode()`则用于将16进制字符串解码回原始的字节数组,再转化为字符串。 在实际应用中,你可能还会遇到其他复杂情况,...

    字符串面试题整理

    9. **字符串转化数字以及数字转化字符串**:在C/C++中,可以使用`atoi()`将字符串转换为整数,`atof()`转换为浮点数,而`itoa()`和`sprintf()`可以将数字转换为字符串。在其他语言如Python中,有内置的`int()`和`str...

    cocos2d-x json字符串与cocos2d::Value转换工具

    该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...

    android byte字节数组转换十六进制字符串

    在Android开发中,有时我们需要将字节数组(byte array)转换为十六进制字符串,以便于数据存储、传输或调试。这是因为字节数组是二进制数据,而十六进制字符串则是一种人类可读的表示方式。下面我们将详细讨论如何...

    C++ 16进制和字符串批量转换

    在C++编程中,进行16进制与字符串之间的转换是一项常见的任务,特别是在处理二进制数据、网络通信或串口通信时。本教程将详细阐述如何在C++中实现混合字符串(包括汉字和数字等字符)的批量16进制转换以及16进制到...

    2049:例5.19字符串判等.cpp

    2049:【例5.19】字符串判等 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 26376 通过数: 9899 【题目描述】 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等。 【输入】 两行,每行...

    C# 将整型数组元素转换为字符串

    在本篇文章中,我们将深入探讨如何在C#中将整型数组元素转换为字符串,并对提供的代码示例进行详细分析。 ### C#中将整型数组转换为字符串的方法 #### 背景介绍 在软件开发过程中,经常需要将不同类型的变量转换成...

    TIA博途中字符串转换相关指令的使用方法(一).docx

    TIA 博途中字符串转换相关指令的使用方法是指在 Siemens SIMATIC TIA Portal 中使用的字符串转换相关指令,包括移动和转换字符串指令、字符串和数值相互进行转换指令等。 1. 移动和转换字符串指令 移动和转换字符...

    C语言浮点数转字符串_C语言浮点数字符串_浮点数转换_

    printf("浮点数 %.2f 转换为字符串为: %.2f\n", num, num); return 0; } ``` 在上面的代码中,`%.2f`表示保留两位小数的浮点数。`printf`函数会根据这个格式将`num`的值转换为字符串并输出。 另外,如果需要在不...

    Android图片Bitmap和字符串String之间的相互转换

    在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...

    整形和字符串的各种转换

    本文将详细介绍整形和字符串之间的各种转换,包括整形到字符串、字符串到整形、字符串到字符数组、字符数组到字符串、不同的进制之间的转换等。 整形到字符串的转换 在Java中,我们可以使用String.valueOf()方法将...

    Android字符串运算的计算器

    1. **字符串解析**:首先,我们需要将用户输入的字符串解析为可以执行的数学表达式。这通常涉及到分隔符(如空格、括号)的识别和操作符优先级的理解。我们可以使用正则表达式来分割字符串,提取数字和操作符。 2. ...

    VB.NET 字符串与二进制间的转换

    在VB.NET编程中,处理数据时经常会遇到将字符串与二进制数据进行转换的情况。这是因为字符串是人类可读的数据表示形式,而二进制数据则更适用于存储和传输。了解如何在两者之间进行转换是至关重要的,特别是当你需要...

    C语言二进制字符串与十六进制字符串相互转化

    要将二进制字符串转化为十六进制字符串,我们需要逐位处理二进制数。每四位二进制数对应一位十六进制数。例如,二进制字符串 "1101 0110" 可以转换为十六进制的 "D6"。在C语言中,可以使用`sscanf`和`sprintf`函数...

    matlab数理统计数据分析:10 深入学习字符串(含教学视频).zip

    1. `lower/upper`:将字符串转换为小写或大写。 2. `isstrprop`:检查字符串属性,如是否只包含数字、字母等。 3. `strcmp`/`strcmpi`:比较两个字符串是否相同,不区分大小写。 4. `regexp`/`regexpi`:使用正则...

    Java程序设计:5 数组与字符串.part2.ppt

    - `String.valueOf(基本数据类型表达式)`:将基本数据类型转换为字符串。 ### 3. 字符串类(String, StringBuffer, StringBuilder) - `String`:不可变字符串,多线程安全。 - `StringBuffer`:可变字符串,线程安全...

    Android存储字符串数据到txt文件

    "Android存储字符串数据到txt文件" Android存储字符串数据到txt文件是Android开发中的一种常见需求,对于大多数开发者来说,存储字符串数据到txt文件是一种非常有用的功能。今天,我们将详细介绍如何在Android中...

    关于面试题目中回环字符串的解答

    在给定的代码中,我们有两个主要的函数`isok()`和两个辅助函数`addhead()`与`addtail()`,用于检查一个字符串是否为回环字符串,并在必要时将其转换为回环字符串。 1. **isok() 函数**: 这个函数用于判断一个字符...

    Android relaceALL替换字符串中的反斜杠

    - 处理路径字符串,例如将Windows风格的路径`C:\Users\John`转换为Unix风格的`C:/Users/John`。 - 解析JSON或XML字符串,其中某些字符(如反斜杠)可能是非法的或需要转义的。 - 编码或解码URL,URL中的反斜杠需要...

Global site tag (gtag.js) - Google Analytics