当前位置: 代码迷 >> J2SE >> 算法:1~N中求出1的个数,(如果11 那1的个数就是2)解决办法
  详细解决方案

算法:1~N中求出1的个数,(如果11 那1的个数就是2)解决办法

热度:732   发布时间:2016-04-24 14:26:31.0
算法: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
  相关解决方案