本文概述
- CPP
- C ++
- Java
- C#
- C ++
例子 :
Input: n = 6
Output: 5Input:n = 10
Output: 13
推荐:请在”
实践
首先, 在继续解决方案之前。
我们首先将0、1、2、3、4、5存储在一个数组中。我们可以看到下一个数字将是10、11、12、13、14、15, 之后的数字将是20、21、23、24、25, 依此类推。我们可以看到不断重复的模式。我们保存计算的结果, 并将其用于进一步的计算。
接下来的6个数字是-
1 * 10 + 0 = 10
1 * 10 + 1 = 11
1 * 10 + 2 = 12
1 * 10 + 3 = 13
1 * 10 + 4 = 14
1 * 10 + 5 = 15
之后, 接下来的6个数字将是-
2 * 10 + 0 = 20
2 * 10 + 1 = 21
2 * 10 + 2 = 22
2 * 10 + 3 = 23
2 * 10 + 4 = 24
2 * 10 + 5 = 25
我们使用这种模式来找到第n个数字。下面是完整的算法。
1) push 0 to 5 in ans vector
2) for i=0 to n
for j=0 to 6// this will be the case when first
// digit will be zero
if (ans[i]*10! = 0)
ans.push_back(ans[i]*10 + ans[j])3) print ans[n-1]
CPP
// C++ program to find n-th number with digits
// in {0, 1, 2, 3, 4, 5}
#include <
bits/stdc++.h>
using namespace std;
// Returns the N-th number with given digits
int findNth( int n)
{
// vector to store results
vector<
int >
ans;
// push first 6 numbers in the answer
for ( int i = 0;
i <
6;
i++)
ans.push_back(i);
// calculate further results
for ( int i = 0;
i <
= n;
i++)
for ( int j = 0;
j <
6;
j++)
if ((ans[i] * 10) != 0)
ans.push_back(ans[i] * 10 + ans[j]);
return ans[n - 1];
}
// Driver code
int main()
{
int n = 10;
cout <
<
findNth(n);
return 0;
}
高效方法:
算法:
1.首先将数字n转换为6。
2.将转换后的值同时存储在数组中。
3.以相反的顺序打印该阵列。
下面是上述算法的实现:
C ++
// CPP code to find nth number
// with digits 0, 1, 2, 3, 4, 5
#include <
bits/stdc++.h>
using namespace std;
#define max 100000
// function to convert num to base 6
int baseconversion( int arr[], int num, int base)
{
int i = 0, rem, j;
if (num == 0) {
return 0;
}
while (num >
0) {
rem = num % base;
arr[i++] = rem;
num /= base;
}
return i;
}
// Driver code
int main()
{
// initialize an array to 0
int arr[max] = { 0 };
int n = 10;
// function calling to convert
// number n to base 6
int size = baseconversion(arr, n - 1, 6);
// if size is zero then return zero
if (size == 0)
cout <
<
size;
for ( int i = size - 1;
i >
= 0;
i--) {
cout <
<
arr[i];
}
return 0;
}
// Code is contributed by Anivesh Tiwari.
Java
// Java code to find nth number
// with digits 0, 1, 2, 3, 4, 5
class GFG {static final int max = 100000 ;
// function to convert num to base 6
static int baseconversion( int arr[], int num, int base)
{
int i = 0 , rem, j;
if (num == 0 ) {
return 0 ;
}while (num >
0 ) {rem = num % base;
arr[i++] = rem;
num /= base;
}return i;
}// Driver code
public static void main (String[] args)
{// initialize an array to 0
int arr[] = new int [max];
int n = 10 ;
// function calling to convert
// number n to base 6
int size = baseconversion(arr, n - 1 , 6 );
// if size is zero then return zero
if (size == 0 )
System.out.print(size);
for ( int i = size - 1 ;
i >
= 0 ;
i--) {
System.out.print(arr[i]);
}
}
}
// This code is contributed by Anant Agarwal.
C#
// C# code to find nth number
// with digits 0, 1, 2, 3, 4, 5
using System;
class GFG {static int max = 100000;
// function to convert num to base 6
static int baseconversion( int []arr, int num, int bas)
{
int i = 0, rem;
if (num == 0) {
return 0;
}while (num >
0) {rem = num % bas;
arr[i++] = rem;
num /= bas;
}return i;
}// Driver code
public static void Main ()
{
// initialize an array to 0
int []arr = new int [max];
int n = 10;
// function calling to convert
// number n to base 6
int size = baseconversion(arr, n - 1, 6);
// if size is zero then return zero
if (size == 0)
Console.Write(size);
for ( int i = size - 1;
i >
= 0;
i--) {
Console.Write(arr[i]);
}
}
}
// This code is contributed by nitin mittal
输出如下:
13
另一种有效的方法:
算法:
1.将数字N减1。
2.将数字N转换为以6为底的数字。
下面是上述算法的实现:
C ++
// CPP code to find nth number
// with digits 0, 1, 2, 3, 4, 5
#include <
iostream>
using namespace std;
int ans( int n){
// If the Number is less than 6 return the number as it is.
if (n <
6){
return n;
}
//Call the function again and again the get the desired result.
//And convert the number to base 6.
return n%6 + 10*(ans(n/6));
}
int getSpecialNumber( int N)
{
//Decrease the Number by 1 and Call ans function
// to convert N to base 6
return ans(--N);
}
/*Example:-
Input: N = 17
Output: 24
Explaination:-
decrease 17 by 1
N = 16
call ans() on 16
ans():
16%6 + 10*(ans(16/6))
since 16/6 = 2 it is less than 6 the ans returns value as it is.
4 + 10*(2)
= 24
hence answer is 24.*/
int main()
{
int N = 17;
int answer = getSpecialNumber(N);
cout<
<
answer<
<
endl;
return 0;
}
// This Code is contributed by Regis Caelum
输出如下
24
时间复杂度:O(logN)
【算法题(找到第n个数字,其数字仅包含为0、1、2、3、4或5)】辅助空间:O(1)
推荐阅读
- Python和OpenCV使用带网络摄像头进行人脸检测
- 升级GCC,支持C++17
- Java8特性大全(最新版)
- 小白用c语言编写七大排序(上)方法(?为了让和笔者一样的小白能看懂,笔者注释了很多))
- Redis哨兵模式部署
- zabbix5.0自定义web监控
- SpringBoot中的Schedule定时任务#yyds干货盘点#
- webterminal开源堡垒机
- #yyds干货盘点#为了完成小姐姐安排的打分系统,又熬了一个小时的夜补充视图与模板