编程的时候一直没养成好的习惯,拿住题想都不想就开始coding,但是这样往往会想当然,希望自己在之后的每周练习中能够养成良好的编程习惯!——记住:拿到题,先思考,尽可能考虑全面,而不是着急火燎的去编码,思考作为coding的前奏,才能事半功倍(作为一个编程小菜鸟,希望能慢慢提升自己编码时候的思维能力,以前我总是喜欢说:“我不喜欢计算机,但是很无奈我本科学了它,研究生还在学它”!今天我告诉自己:有能耐你就放弃现在的专业,不喜欢就撤退;没能耐你就好好学,不要再说不喜欢,不能改变的事情就努力去做,努力去培养兴趣,努力去做好,而不是拿不喜欢当借口!我深知我还得在计算机行业摸爬滚打好几年,所以我加油!今天注定不一样!OK,不扯废话了...)
既然不能解决眼前的苟且,就先把诗和远方放一放!加油吧,我的喵小姐!
1、翻转数列
我一看这个题就觉得:so easy嘛!不是一个循环就搞定了,然后我就开始匆匆忙忙编码了...
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//共有n个数
int m=sc.nextInt();//每隔m个数符号改变一次
int flag=1;//控制符号变换
int num=0;//计数
int sum=0;//n个数的和
for(int i=0;i<n;i++){
num=num%m;
if(num==0){
flag=flag*(-1);
}
sum=sum+flag*(i+1);
num++;
}
System.out.println(sum);
}
}
编完之后还自信满满,感觉一定没问题,结果...
纳尼?一个简单的循环都能超时,再看时间要求——1s,可不是吗?当数比较多时,肯定会超时啊!
恩!好吧!那这组数应该是有规律的!就开始把这些数写在纸上,果然,n个数中正数、负数各占一半,两两对应起来相加正好为m,原来是这么简单的吗?此时的自己简直惊呆了!(假如有8个数,每2个数翻转一次,则为:
-1,-2,3,4,-5,-6,7,8---即(-1,3)(-2,4)(-5,7)(-6,8)),上代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();//共有n个数
int m=sc.nextInt();//每隔m个数符号改变一次
int sum=(n/2)*m;//n个数的和
System.out.println(sum);
}
}
这下总该对了吧!心里又开始窃喜了,结果,高兴的还是有点早...
瞬间懵了,居然还有问题!让我一步步再缕缕,n/2应该没问题,那就是乘m的时候出了问题,难道溢出了?(好久没看java了,以前学的也忘光了,其实本来学的也不扎实)然后尝试着上网查了一下,发现真的如此,顺便看了一下解决思路,int转换成long试试啊!
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long n=sc.nextInt();//共有n个数
long m=sc.nextInt();//每隔m个数符号改变一次
long sum=(n/2)*m;//n个数的和
System.out.println(sum);
}
}
这下总该对了吧!不过,一旦正负数不是一一对应呢,负数如果比正数多一轮,是不是该分开解决?还是再看一遍题吧!恩,我看见了,n可以被2m整除,所以可能是一一对应的 ... 所以,应该可以看结果了!
深吸一口气,真的,如果单看题,或者单看完成的代码,会感觉这题就很简单啊!但是对我这种做题不先走脑子或者基础不扎实亦或者不好好看题的人来说,就是会绕一大圈,希望通过这道题,能给自己点警示:拿到题——1)认真看题,注意每点要求,比如时间复杂度,空间复杂度;2)审完题,先思考,而不是着急coding;3)基础不扎实的话,就边练习编码边夯实一下基础!GO!