同样的代码,为什么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();
}
}
}
java字符串相加不要用+,改成StringBuilder或StringBuffer,字符串不多无所谓,如果是指数级别的相加,必须用StringBuilder或StringBuffer,性能差几百倍 java 底层是c++
越高级的语言效率越低,这是大趋势~ 超时不至于把 netspirit 发表于 2021-10-16 17:44
超时不至于把
看上面的截图,Java超时了,一样的代码 {:1_904:}新手觉得虽然java臃肿一点 但也不至于这么夸张吧 编程你必须搞懂的两件事, 编译语言和解释语言 汇编>C++>Java>Python。 java要能跑过C++那才有鬼 你的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 个错误