题解 | #小红的字符生成#

小红的字符生成

https://www.nowcoder.com/practice/f8659377ca104b1aad45dd2fb564c940

解题思路

这是一道从结果反推构造的题目。我们需要从目标数量的'a'开始,反向思考如何构造原始字符串。 关键思路:

  1. 从高位字母开始构造,每个字母可以分裂成两个小一位的字母
  2. 需要找到最小的字母位置k,使得2^k ≥ x
  3. 从k位置开始,逐步处理剩余数量,必要时添加较小位置的字母

代码

#include <iostream>
#include <string>
using namespace std;

int main() {
    long long x;
    cin >> x;
    
    string ans;
    // 找到最高位
    int k = 0;
    long long pow2 = 1;
    while(pow2 < x) {
        k++;
        pow2 *= 2;
    }
    
    // 从高位往低位构造
    while(x > 0) {
        while(k >= 0 && (1LL << k) > x) {
            k--;
        }
        if(k < 0) break;
        ans += (char)('a' + k);
        x -= (1LL << k);
    }
    
    if(x == 0) cout << ans << endl;
    else cout << -1 << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long x = sc.nextLong();
        
        StringBuilder ans = new StringBuilder();
        // 找到最高位
        int k = 0;
        long pow2 = 1;
        while(pow2 < x) {
            k++;
            pow2 *= 2;
        }
        
        // 从高位往低位构造
        while(x > 0) {
            while(k >= 0 && (1L << k) > x) {
                k--;
            }
            if(k < 0) break;
            ans.append((char)('a' + k));
            x -= (1L << k);
        }
        
        System.out.println(x == 0 ? ans.toString() : -1);
    }
}
x = int(input())

ans = []
# 找到最高位
k = 0
pow2 = 1
while pow2 < x:
    k += 1
    pow2 *= 2

# 从高位往低位构造
while x > 0:
    while k >= 0 and (1 << k) > x:
        k -= 1
    if k < 0:
        break
    ans.append(chr(ord('a') + k))
    x -= (1 << k)

print(''.join(ans) if x == 0 else -1)

算法及复杂度

  • 算法:贪心构造。从最高位开始,逐步构造字符串。
  • 时间复杂度: ,主要是找到最高位和构造过程。
  • 空间复杂度: ,需要存储构造的字符串。
全部评论

相关推荐

2024-11-26 00:10
门头沟学院 Java
chenxinxu:现在招聘的都学精了,你光学点数据库和中间件做个应用型项目人家看不上,你得有点可以“吹水”的高谈阔论的“高大上”的玩意,比如写点什么“基于分布式 Raft 共识性算法的XXX”balabala 的,然后做了什么详尽的 benchmark 怎么优化的吞吐率性能之类的,看起来就是科研论文研究领域。现在人不都这样吗,他知道的知识都是白菜,他不知道的领域都是高端,找点让大部分人看起来高端的玩意写
点赞 评论 收藏
分享
KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务