用尽可能少得代码实现如下要求

今天做某安全公司笔试题,最后一道编程题如下:
写程序,打印如下信息,程序尽可能少。

(a)(b)(c)……(z)
(ab)(ac)(ad)……(az)(bc)(bd)……(bz)……(yz)
(abc)(abd)(abe)…………(xyz)
………………………………
………………………………
…………………………
(abcd…………xyz)

最后我想要告诉大家一个宇宙间不变的真理:
中午不睡,下午崩溃.

阅读 3.8k
4 个回答

我很好奇哪家安全公司。

采用进位的思想,
ax ay az ... z再+1就溢出了, 进位将a这一位+1变成b,然后z这一位归零,由于字母不能重复,归为进位的下一个字母 即c

#include <stdio.h>
#include <stdlib.h>
int main() {
    char cs[] = "abcdefghijklmnopqrstuvwxyz";
    for(int n=1; n<=26; n++) { // n代表行数,也代表每一组的长度
        char *str = (char *)malloc(n+1);
        for(int p=0; p<n; p++) str[p] = cs[p]; // 初始化第一组字符串
        str[n] = 0;
        for(;;) {
            printf("(%s)",str);
            int q = n - 1; // 从末尾开始+1
            while(str[q] == cs[26 - (n - q)] && q != -1) q--; // 找到可以字符+1的位
            // 比如 abfxyz,后三位都已经取了最大值,只有f可以+1,取f所在的位置,即q = 2
            if(q == -1) break; // q溢出时就表示遍历完了
            str[q] = str[q] + 1; // 将该位的字母+1
            char m = q;
            while(str[++m] != 0) str[m] = str[q] + m-q; // 后面几位依次排列
            // 比如abfxyz 下一组是 abg***, ***就是hij
        }
        putchar('\n');
        if(n == 3) break;// 只输出前3行,注释掉就输出所有的,不过会很长很长很长。。。
    }
}

图片描述

package com.fonxian.set;

import java.util.ArrayList;

public class Test {
    static ArrayList<ArrayList<String>> getSubsets(ArrayList<String> set, int index){
        ArrayList<ArrayList<String>> allsubsets;
        if(set.size() == index){ 
            allsubsets = new ArrayList<ArrayList<String>>();
            allsubsets.add(new ArrayList<String>()); //empty set
        }else{
            allsubsets = getSubsets(set, index+1);
            String item = set.get(index);
            ArrayList<ArrayList<String>> moresubsets =  new ArrayList<ArrayList<String>>();
            for(ArrayList<String> s: allsubsets){
                ArrayList<String> newSubset = new ArrayList<String>();
                newSubset.addAll(s);
                newSubset.add(item);
                moresubsets.add(newSubset);
            }
            allsubsets.addAll(moresubsets);
        }
        return allsubsets;
    }
public static void main(String[] args){
        ArrayList<String> s = new ArrayList<String>();
        s.add("(a)");
        s.add("(b)");
        s.add("(c)");
        s.add("(d)");
        ArrayList<ArrayList<String>> allsubsets = getSubsets(s, 0);
        for(ArrayList<String> set : allsubsets){
            System.out.println(set);
        }
    }
}

测试用例

[]
[(d)]
[(c)]
[(d), (c)]
[(b)]
[(d), (b)]
[(c), (b)]
[(d), (c), (b)]
[(a)]
[(d), (a)]
[(c), (a)]
[(d), (c), (a)]
[(b), (a)]
[(d), (b), (a)]
[(c), (b), (a)]
[(d), (c), (b), (a)]


//scala 2.11.6
object CharChar {

  def main(args: Array[String]) {
    val chars = 0.to(25).map('a' + _).map(_.toChar).toList
    1 to 3 foreach {
      x =>
        getList(x,chars).foreach {
          result =>
            print('('+result+')')
        }
    }
  }

  def getList(num: Int, vec: List[Char]): Iterator[String] = {
    num match {
      case 0 =>
        Iterator("")
      case _ =>
        vec.tails.flatMap {
          case head :: tail =>
            getList(num - 1, tail).map(head + _)
          case x => Vector.empty
        }
    }
  }
}

3改成你要的数字就好了,本地没有编译环境的话可以用这个
https://codepad.remoteinterview.io/ResoluteHypnoticSpiralPedro

IOS android的都来了,看样子是要补个JS的了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进