吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1518|回复: 35
收起左侧

[讨论] 同样的代码,为什么Java占用内存和运行时间比C++多这么多

[复制链接]
蓝色魅影 发表于 2021-10-16 17:24
本帖最后由 蓝色魅影 于 2021-10-18 19:00 编辑

下面是一到常规的进制转化编程题,用Java写一直超时,占用内存也高,后面在网上找别人C++写好的答案,发现和我的方法是一样的,然后把他的C++稍微改一改写成Java,发现还是过不了,Java写的超时了,内存占用也远远比C++高,有大佬能解释下嘛,还有如果Java要用这种方法写这题目有什么改进办法吗
[C++] 纯文本查看 复制代码
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    int n;
    cin>>n;
    for(int k=1;k<=n;k++)
    {
        string s1,s2;//s1为输入的原始的十六进制串,s2为转化成的二进制串
        cin>>s1;
        s2="";//初始化
        for(int i=0;i<s1.length();i++)//遍历,字符串上加上每一位
        {
            switch(s1[i])
            {
                case '0':s2+="0000";break;
                case '1':s2+="0001";break;
                case '2':s2+="0010";break;
                case '3':s2+="0011";break;
                case '4':s2+="0100";break;
                case '5':s2+="0101";break;
                case '6':s2+="0110";break;
                case '7':s2+="0111";break;
                case '8':s2+="1000";break;
                case '9':s2+="1001";break;
                case 'A':s2+="1010";break;
                case 'B':s2+="1011";break;
                case 'C':s2+="1100";break;
                case 'D':s2+="1101";break;
                case 'E':s2+="1110";break;
                case 'F':s2+="1111";break;
                default:break;
            }
        }
        int len=s2.length();
 
        if(len%3==1)//三个二进制为一位八进制,二进制串前面补0,确保二进制串的长度为3的倍数
            s2="00"+s2;
        else if(len%3==2)
            s2="0"+s2;
        int flag=0;
        for(int i=0;i<=s2.length()-3;i+=3)
        {
            int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
            if(num)
                flag=1;//忽略前导0
            if(flag)
                cout<<num;
        }
        cout<<endl;
    }
    return 0;
}


[Java] 纯文本查看 复制代码
import java.util.Scanner;

public class Main {
        public static void main(String[] args) {
                Scanner scanner = new Scanner(System.in);
                int n = scanner.nextInt();
                
            for(int k=1;k<=n;k++)
            {
                String s1,s2;//s1为输入的原始的十六进制串,s2为转化成的二进制串
                s1 = scanner.next();
                s2="";//初始化
                for(int i=0;i<s1.length();i++)//遍历,字符串上加上每一位
                {
                    switch(s1.charAt(i))
                    {
                        case '0':s2+="0000";break;
                        case '1':s2+="0001";break;
                        case '2':s2+="0010";break;
                        case '3':s2+="0011";break;
                        case '4':s2+="0100";break;
                        case '5':s2+="0101";break;
                        case '6':s2+="0110";break;
                        case '7':s2+="0111";break;
                        case '8':s2+="1000";break;
                        case '9':s2+="1001";break;
                        case 'A':s2+="1010";break;
                        case 'B':s2+="1011";break;
                        case 'C':s2+="1100";break;
                        case 'D':s2+="1101";break;
                        case 'E':s2+="1110";break;
                        case 'F':s2+="1111";break;
                        default:break;
                    }
                }
                int len=s2.length();
         
                if(len%3==1)//三个二进制为一位八进制,二进制串前面补0,确保二进制串的长度为3的倍数
                    s2="00"+s2;
                else if(len%3==2)
                    s2="0"+s2;
                int flag=0;
                for(int i=0;i<=s2.length()-3;i+=3)
                {
                    int num=4*(s2.charAt(i)-'0')+2*(s2.charAt(i+1)-'0')+(s2.charAt(i+2)-'0');
                    if(num!=0)
                        flag=1;//忽略前导0
                    if(flag==1)
                        System.out.print(num);
                }
                System.out.println();
            }
                
        }
        
}


QQ图片20211016172003.png
QQ截图20211016173020.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lu_wakin 发表于 2021-10-16 19:21
java字符串相加不要用+,改成StringBuilder或StringBuffer,字符串不多无所谓,如果是指数级别的相加,必须用StringBuilder或StringBuffer,性能差几百倍

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
蓝色魅影 + 2 + 1 多谢 晚点我试试

查看全部评分

我的天空世界 发表于 2021-10-16 17:34
lilin19861230 发表于 2021-10-16 17:41

回帖奖励 +1 CB吾爱币

越高级的语言效率越低,这是大趋势~
netspirit 发表于 2021-10-16 17:44

回帖奖励 +1 CB吾爱币

超时不至于把
 楼主| 蓝色魅影 发表于 2021-10-16 17:48

看上面的截图,Java超时了,一样的代码
980041382 发表于 2021-10-16 17:54

回帖奖励 +1 CB吾爱币

新手觉得虽然java臃肿一点 但也不至于这么夸张吧
lras 发表于 2021-10-16 17:56

回帖奖励 +1 CB吾爱币

编程你必须搞懂的两件事, 编译语言和解释语言
ShyGW 发表于 2021-10-16 17:57
汇编>C++>Java>Python。
lyj996 发表于 2021-10-16 18:04

回帖奖励 +1 CB吾爱币

java要能跑过C++那才有鬼
whsdaks 发表于 2021-10-16 18:10

回帖奖励 +1 CB吾爱币

你的java代码放到编译器里跑过了吗,好像报错了,我不想开idea用cmd跑了
[Java] 纯文本查看 复制代码
javac Main.java
Main.java:10: 错误: 编码GBK的不可映射字符
                String s1,s2;//s1涓鸿緭鍏ョ殑鍘熷鐨勫崄鍏繘鍒朵覆锛宻2涓鸿浆鍖栨垚鐨勪簩杩涘埗涓?
                                                                   ^
Main.java:12: 错误: 编码GBK的不可映射字符
                s2="";//鍒濆鍖?
                            ^
Main.java:13: 错误: 编码GBK的不可映射字符
                for(int i=0;i<s1.length();i++)//閬嶅巻锛屽瓧绗︿覆涓婂姞涓婃瘡涓?浣?
                                                                ^
Main.java:13: 错误: 编码GBK的不可映射字符
                for(int i=0;i<s1.length();i++)//閬嶅巻锛屽瓧绗︿覆涓婂姞涓婃瘡涓?浣?
                                                                  ^
Main.java:38: 错误: 编码GBK的不可映射字符
                if(len%3==1)//涓変釜浜岃繘鍒朵负涓?浣嶅叓杩涘埗锛屼簩杩涘埗涓插墠闈㈣ˉ0锛岀‘淇濅簩杩涘埗涓茬殑闀垮害涓?3鐨勫?嶆暟
                                        ^
Main.java:38: 错误: 编码GBK的不可映射字符
                if(len%3==1)//涓変釜浜岃繘鍒朵负涓?浣嶅叓杩涘埗锛屼簩杩涘埗涓插墠闈㈣ˉ0锛岀‘淇濅簩杩涘埗涓茬殑闀垮害涓?3鐨勫?嶆暟
                                                                            ^
Main.java:38: 错误: 编码GBK的不可映射字符
                if(len%3==1)//涓変釜浜岃繘鍒朵负涓?浣嶅叓杩涘埗锛屼簩杩涘埗涓插墠闈㈣ˉ0锛岀‘淇濅簩杩涘埗涓茬殑闀垮害涓?3鐨勫?嶆暟
                                                                                ^
7 个错误
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-21 00:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表