Leetcode 168. Excel表列名称(Java)(初试 “ 动态 “ 字符串)

Leetcode 168. Excel表列名称

给定一个正整数,返回它在 Excel 表中相对应的列名称。

例如,
1 -> A
2 -> B
3 -> C

26 -> Z
27 -> AA
28 -> AB

示例 1:
输入: 1
输出: “A”

示例 2:
输入: 28
输出: “AB”

示例 3:
输入: 701
输出: “ZY”

/*类似于把10进制转换为26进制
但与普通进制转换不一样的是,不能直接把A当0,在%和/运算里面需将n-1
*/
class Solution {
    
    
    public String convertToTitle(int n) {
    
    
         StringBuilder str = new StringBuilder();  //单线程--StringBuilder 多线程--StringBuffer
        do{
    
    
            //假如是n%26+64,当n==26时,得不到Z,而是A
            str.insert(0,(char)((n-1)%26 + 65)); //'A'的ASCII值为65
            n = (n-1)/26;  //假如是n=n/26,那么当n=26,就会在str前多加一个A
        }while(n>0); 
        return str.toString(); //不可直接返回str
    }
}

String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。

使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

StringBuilder是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

使用策略

  1. 基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
  2. 不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。

猜你喜欢

转载自blog.csdn.net/CSDNWudanna/article/details/107945837