热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

K-thstring微软2014在线笔试题

DescriptionConsiderastringsetthateachofthemconsistsof{0,1}only.Allstringsinthe

Description

Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. 
Write a program to find and output the K-th string according to the dictionary order. If s​uch a string doesn’t exist, 
or the input is not valid, please output “Impossible”. For example, if we have two ‘0’s and two ‘1’s, 
we will have a set with 6 different strings, {0011, 0101, 0110, 1001, 1010, 1100}, and the 4th string is 1001.


Input

The first line of the input file contains a single integer t (1 ≤ t ≤ 10000), 
the number of test cases, followed by the input data for each test case.
Each test case is 3 integers separated by blank space: N, M(2 <= N + M <= 33 and N , M >= 0), 
K(1 <= K <= 1000000000). N stands for the number of ‘0’s, M stands for the number of ‘1’s, 
and K stands for the K-th of string in the set that needs to be printed as output.


Output

For each case, print exactly one line. If the string exists, please print it, otherwise print “Impossible”.


Sample In

3
2 2 2
2 2 7
4 7 47

Sample Out

0101
Impossible
01010111011

     其实说了这么多,意思很简单,就是输入N个0,M个1.然后求出由M,N个1,0组成的第K大的数。如果不存在则输出impossible.

主要是通过递归的判断当前0,1组合生成的个数与K进行比较。

  (保证在不减一个0时,生成的组合总数是大于K的,否则return。)

   若当前0的个数减一后,生成的总数要大于K,则输出0,同时0的个数减一,K,1的个数不变。

   若当前0的个数减一后,生成的总数小于K,则输出1,同时1的个数减一,0的个数不变,K=K-当前总数。

   递归调用。最后能得到结果。

import java.util.Scanner;

public class Main {

public static void print(Object[] res) {
for (Object obj : res) {
System.out.print(obj + " ");
}
System.out.println();
}
public static int getC(int m, int n){
int maxNum = 1;
int mm = Math.max(m, n);
int nn = Math.min(m, n);
for(int i = m + n; i > mm; i --){
maxNum*= i;
}
for(int i = 1; i <= nn; i ++){
maxNum/= i;
}
return maxNum;
}
public void solve(int num1, int num0, StringBuffer sb, int k){
if(num0 <0 || num1 <0)return;
if(num1 == 0 && num0 == 0) return ;
if( k == 0){
while(num1 > 0){
sb.append(1);
num1 --;
}

while(num0 > 0) {
sb.append(0);
num0--;
}
return ;
}
if(num0 > 0 && getC(num1, num0 - 1) > k){
sb.append(0);
solve(num1, num0 - 1, sb, k);
}
else if(num0 > 0 && getC(num1, num0 - 1) sb.append(1);
solve(num1 - 1, num0, sb, k - getC(num1, num0 - 1));
}
else if(num0 > 0 && getC(num1, num0 - 1) == k){
sb.append(0);
solve(num1, num0 - 1, sb, 0);
}
}
public static void main(String[] args) {
Main obj = new Main();
Scanner input = new Scanner(System.in);
int cas = input.nextInt();
int m , n, k;
StringBuffer sb = new StringBuffer("");
while ((cas -- ) > 0){
n = input.nextInt();
m = input.nextInt();
k = input.nextInt();
sb.delete(0, sb.length());
if(getC(m, n)  else {
                obj.solve(m, n, sb, k);
                System.out.println(sb.toString());
            }
}

}

}

网上分析的另一种思路:

N个0和M个1的组合问题。 下面是需代码。
解释:
dp[n][m]:n个0和m个1一共可能的组合数。
dp[n][m]递推公式: dp[n][m] = dp[n - 1][m] + dp[n][m - 1]。 表示:如果最高位是1的组合数为dp[n][m - 1], 如果最高位为0, 组合数为dp[n - 1][m].

如何生成第K个数字:
如果dp[n][m]

如果最高位是0的组合数大于等于K(dp[n][m - 1] >= K), 那么最高为一定为0。
如果最高位是0的组合数小于K, 那么最高位一定为1。 此时,因为最高位为0的组合有dp[n][m-1]个,问题变成:在N个0和(M-1)个1中需要为(K - dp[n][m-1])的数字是多少。

这是两个简单的动态规划的组合。其实dp数组中是杨辉三角,古人的智慧是无穷的!

另外,因为题目给定了M,N,K的取值范围,所以代码里面没有做合法性检查。
算法复杂度 O(M * N)

#include
 
#include
#include
#include
using  namespace  std;
 
string
calc(
int  N,  int  M,  int  K) {
   vector long  long > > dp(N + 1, vector< long  long >(M + 1));
 
   for  ( int  n = 0; n <= N; n++) {
     for  ( int  m = 0; m <= M; m++) {
       if  (n == 0 || m == 0) {
         dp[n][m] = 1;
       else  {
         dp[n][m] = dp[n - 1][m] + dp[n][m - 1];
       }
     }
   }
 
   if  (dp[N][M]
     return  "Impossible" ;
   }
   string res =  "" ;
   while  (N >= 1 && M >= 0 && K > 0) {
     if  (dp[N - 1][M] >= K) {
       res +=  "0" ;
       N--;
     else  {
       res +=  "1" ;
       K -= dp[N - 1][M];
       M--;
     }
   }
   while  (M > 0) {
     res +=  "1" ;
     M--;
   }
   return  res;
}
 
int  main() {
   // N: 0
   // M: 1
   int  k;
   cin >> k;
   int  N;
   int  M;
   int  K;
   for  ( int  i = 0; i
     cin >> N >> M >> K;
     cout < "\n" ;
   }
   return  0;
};


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文详细介绍了 Pentaho Kettle 中 RowMetaInterface.writeMeta 方法的使用,并提供了多个代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
author-avatar
用户89e44snpn5
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有