算法:1~N中求出1的个数,(如果11 那1的个数就是2)
算法:1~N中求出1的个数,(如果11 那1的个数就是2)
[解决办法]
//1---N中num個數
int count(int N,int num)
{
if(N <=0 || num <0 || num> 9)
return 0;
StringBuffer sb = new StringBuffer();
for(int i=1;i <N+1;i++)
sb.append(String.valueOf(i));
int totalCount = sb.toString().length();
String temp = sb.toString().replaceAll(String.valueOf(num), " ");
return totalCount-temp.length();
}
[解决办法]
int len = 0;
for(int i=1;i <=N;i++)
len += (i+ " ").replaceAll( "[^1] ", " ").length();
System.out.println(len);
[解决办法]
public int getNumbers(int n) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i <= n; i++) {
buffer.append(i);
}
int count = 0;
for(int i = 0; i < buffer.length(); i++) {
if( '1 ' == buffer.charAt(i)) {
count++;
}
}
return count;
}
[解决办法]
///////////////////////////////////////////////////////////////////////////////////
//
//作者:peter.zhou (msn:keler_zhou@hotmail.com)
//日期:2007/7/21
//备注:
// 找出1-n中m的个数m为1-9中的一个数字
// 思路:根据zeroasan_() 的思路, 此种思路才是这个考题的真正意图,
// 而不是说用字符串进行处理,或者是遍历
// 此代码属于原创,转载请注明转载地址以及原作者
////////////////////////////////////////////////////////////////////////////////////
public static void Demo_Numbers_GetGivenNumberCount(int nNumber, int nNeedtoCount, ref long nTotalCount)
{
if (nNumber == 0)
return ;
//转化为字符串
string strNumber = nNumber.ToString();
//数字的长度
int nNumberLength = strNumber.Length;
//该数的最高位的数字
int nFirstNumber = int.Parse(strNumber[0].ToString());
//该数的低位为零的最大整数
int nMaxTimesTen = nFirstNumber * TenPower(nNumberLength - 1);
//获取除最高位以外的其它所有位中包含要求的的数字的个数
nTotalCount = nTotalCount + (TenPower(nNumberLength - 1) * (nNumberLength - 1) / 10) * nFirstNumber;
//针对最高位的数字和所求的那个数字的大小关系补足所求的数字的个数
if (nNeedtoCount < nFirstNumber)
{
nTotalCount = nTotalCount + TenPower(nNumberLength - 1);
}
else if (nNeedtoCount == nFirstNumber)
{
nTotalCount = nTotalCount + 1 + (nNumber - nMaxTimesTen);
}
else
{
;//(nNeedtoCount > nFirstNumber)
}
//递归
Demo_Numbers_GetGivenNumberCount(nNumber - nMaxTimesTen, nNeedtoCount, ref nTotalCount);
}
//不知道System.math里面的乘方是否速度快,暂时自己写了一个
private static int TenPower(int nPower)
{
int a = 1;
for (int i = 0; i < nPower; i++)
{
a *= 10;
}
return a;
}
[解决办法]
俺这个效率绝对高哈,循环次数那是相当少啊~~~~
思路:先数最高位有多少个1,再数次高位……,最后数个位数包含的1
private static int count1(int n) {
int count = 0;
String num = n+ " ";
int x = (int)Math.pow(10, num.length()-1);
for(int i=0; i <num.length(); i++) {
count += Integer.parseInt( "0 "+num.substring(0, i))*x;
if(num.charAt(i)> '1 ') {
count += x;
}else if(num.charAt(i)== '1 ') {
count += Integer.parseInt(num.substring(i+1))+1;
}
x /= 10;
}
return count;
}
[解决办法]
package test1;
public class Test4
{
public static void main ( String args[] )
{
int i=117141;
int count=0;
String ms=String.valueOf(i);
for(int j=0;j <ms.length();j++){
if(ms.charAt(j)== '1 ')
count+=1;
}
System.out.println(count);
}
}
[解决办法]
我也说一下。。。呵呵。。!!!
将你要写的数据源转换成字符串。。
用charAt();拿出来再用数据集(ArrayList)将每个存储来
再每个拿出来比较是不是1,
定义一个变量为零。
是就自增
不是就返回。。
再打印变量。。。。
嗯。我只会说不会作。。。呵呵。。不知对不对。。。。
大家学习学习。。。。
[解决办法]
是有规律的,可以总结出公式来.以1234举例说明.
1 2 3 4
| | | |_____4 * 0 * 10^(0-1) + 10^0 = 1
| | |_______3 * 1 * 10^(1-1) + 10^1 = 13
| |_________2 * 2 * 10^(2-1) + 10^2 = 140
|___________1 + 3 * 10^(3-1) + 234 = 535
1 + 13 + 140 + 535 = 689
主要是拆分出数字1的跟不是1的公式是不一样的. 这样的话就能看出点规律来了.就是下边这两个了.
if(x==1)
i += 1+j*Math.pow(10, j-1) + (j> 0?y:0);
else if(x!=0)
i += x * j * Math.pow(10, j - 1) + Math.pow(10, j);
