蓝色魅影 发表于 2021-10-16 17:24

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

本帖最后由 蓝色魅影 于 2021-10-18 19:00 编辑

下面是一到常规的进制转化编程题,用Java写一直超时,占用内存也高,后面在网上找别人C++写好的答案,发现和我的方法是一样的,然后把他的C++稍微改一改写成Java,发现还是过不了,Java写的超时了,内存占用也远远比C++高,有大佬能解释下嘛,还有如果Java要用这种方法写这题目有什么改进办法吗
#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)
            {
                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-'0')+2*(s2-'0')+(s2-'0');
            if(num)
                flag=1;//忽略前导0
            if(flag)
                cout<<num;
      }
      cout<<endl;
    }
    return 0;
}

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();
            }
               
      }
      
}


lu_wakin 发表于 2021-10-16 19:21

java字符串相加不要用+,改成StringBuilder或StringBuffer,字符串不多无所谓,如果是指数级别的相加,必须用StringBuilder或StringBuffer,性能差几百倍

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

java 底层是c++

lilin19861230 发表于 2021-10-16 17:41

越高级的语言效率越低,这是大趋势~

netspirit 发表于 2021-10-16 17:44

超时不至于把

蓝色魅影 发表于 2021-10-16 17:48

netspirit 发表于 2021-10-16 17:44
超时不至于把

看上面的截图,Java超时了,一样的代码

980041382 发表于 2021-10-16 17:54

{:1_904:}新手觉得虽然java臃肿一点 但也不至于这么夸张吧

lras 发表于 2021-10-16 17:56

编程你必须搞懂的两件事, 编译语言和解释语言

ShyGW 发表于 2021-10-16 17:57

汇编>C++>Java>Python。

lyj996 发表于 2021-10-16 18:04

java要能跑过C++那才有鬼

whsdaks 发表于 2021-10-16 18:10

你的java代码放到编译器里跑过了吗,好像报错了,我不想开idea用cmd跑了
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 个错误
页: [1] 2 3 4
查看完整版本: 同样的代码,为什么Java占用内存和运行时间比C++多这么多