用JAVA刷算法的常见问题及解决之道 系列(一)

“工欲善其事,必先利其器”——题记

       最近用JAVA语言刷PAT 和leetcode上的算法题目,其间遇到了很多问题,有些在我们做项目时不容易被发现,但是在刷算法题目时,一些bug往往出自其中且不易发现。选择不当时会很大程度上影响算法的时间复杂度。故而想总结一类这样的篇目,以便于对日后的算法、代码设计不断优化提高。

我们先从一些基本的谈起:

一、关于字符串、字符的处理

String 转char

1.将单个字符由char转为String:

String s="acv";

char c=s.charAt(index);//此处index为你想转的单个字符在字符串 s 中的下标

2.将整个字符串转为字符数组char [ ]:

String s="acv";

char c[ ]=s.toCharArray();

char转为String

1.单个字符的转换

法一:String s=String.valueOf('c');

法二:String s=Character.toString('c');

法三:String s=""+'c';

2.多个字符一次性转为String字符串

如目前有一个字符数组   char c[ ]={'a', 'c', 'v'};

法一:String s=new String( c );

法二:String s=String.valueOf ( c );

int (或int [ ])和String的互转

这里可以把int类型看作char 类型,和上述 char和String 的转换一样

二、用Scanner类获取单个字符

java语言中没有这个方法,但我们可以这样操作:

三、String中关于next() 和nextLine() 的区别和用法:

1、String 中next() 查找并返回来自此扫描器的下一个完整标记, 获取一个字符串

在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉。只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符。所以next()方法不能得到带空格的字符串。next()获取第一个空格前数据。next()见到回车也会结束。

注意:next() 和 nextInt()、nextDouble()、nextFloat()等都是如上述一样的用法

2.nextLine() 此扫描器执行当前行,并返回跳过的输入信息,获取一行数,见到回车就结束,可获得包含空格在内的字符。

它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。

3.两者使用顺序不一样时会产生不同的效果:

(1)next() 在nextLine之前:

案例一:

 在输入了 123后,我又输入了空格和56,因此,k是12,s 是空格和56

案例二:

在输入了123后,打了回车,这时会发现一个奇怪的现象:还为来得及输入(即执行第13行代码:输入一行字符串),便已经打印出了结果。

其实是因为此处的String 类 s 获取了123后面的回车符,并且因为nextLine()见到回车结束,所以产生了以上的结果。

为解决这个问题,我们可以这样做:

只需在next()类的方法后加上一个:String s=sc.nextLine(); 将回车符消耗掉,如下:

(2)nextLine ()  在前,next() 类在后是不会出现上述问题的

(3)nextLine() 和 nextLine() 之间不会出现上述问题

四、数字字符串转为int、float、double等数字类型

1.转int

String s="123";

int n=Integer.parseInt(s);

2.转float

String s="1.23";

float n=Float.parseFloat(s);

3.转double

double n=Double.parseDouble(s); 

五、StringBuilder、StringBuffer在算法中常用的方法

当对字符串进行修改时,需要使用StringBuilder 和StringBuffer类。

这两个类和String 不同之处在于,它们能够被多次修改。

1.StringBuilder 类非线程安全,不可同步访问。但有速度又是,所以如果不考虑线程安全问题,建议用StringBuilder

2.StringBuffer是线程安全的,但相对较慢。

3.StringBuilder 中常用方法:

(1)append(String s)或 append(char c) //进行字符串的连接

(2)toString()  //返回一个与构建器或者缓冲器内容相同的字符串

这里说的比较抽象,具体来一个经典算法的应用,请移步——

https://blog.csdn.net/weixin_43156201/article/details/104116141

发布了13 篇原创文章 · 获赞 11 · 访问量 869

猜你喜欢

转载自blog.csdn.net/weixin_43156201/article/details/104112723
今日推荐