刷题中的小技巧(一)

Java如何判断int溢出

//因为double范围比int大很多,所以使用double来判断是否溢出很简单
public int reverse2(int x) {
	double ans=0;
	int flag=1;
	if(x<0){
	    flag=-1;
	}
	x=x*flag;
	while(x>0) {
	    ans = 10 * ans + x % 10;
	    x = x / 10;
	}
	if(ans>Integer.MAX_VALUE){//判断是否溢出
	    System.out.println(ans);
	    return 0;
	}
	else
	    return (int)(flag*ans);
}

Java中的map详解

HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。

TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。


java中如何不自己写排序方法完成排序

1. 如果要排序的东西是放在一个数组里面的
1.1 如果要排序的东西是基本数据类型,如int
int[] c=new int[]{4,5,1,2,3,6,9};
Arrays.sort(c);
Arrays.sort(c,1,4);
1.2 如果要排序的东西是java自己的类,如Integer
Integer[] b=new Integer[]{4,5,1,2,3,6,9};
Arrays.sort(b);
Arrays.sort(b,1,4,Collections.reverseOrder());
Arrays.sort(b, Comparator.reverseOrder());
for(int i=0;i<7;i++)
	System.out.print(b[i]);
1.3 如果要排序的东西是你自己实现的类,那就在类里面直接重写compareTo方法
import java.util.*;

public class Solution{
    static class time implements Comparable{
        private int a;
        private int b;

        public time(int a, int b){
            this.a=a;
            this.b=b;
        }

        public int geta(){
            return this.a;
        }

        public int getb(){
            return this.b;
        }

        @Override
        public int compareTo(Object o) {
            time o2=(time)o;
            return o2.getb()-this.getb();
        }
    }
    public time[] fun(time[] a){
        Arrays.sort(a);
        return a;
    }


    public static void main(String [] arg){
        Solution s=new Solution();
        time[] num=new time[]{new time(1,2),new time(2,4),new time(3,3),new time(1,5)};

        s.fun(num);

        for(int i=0;i<4;i++){
            System.out.print(num[i].geta());
            System.out.print(" ");
            System.out.println(num[i].getb());
        }



    }
}
2. 如果要排序的东西是放在一个List里面的
2.1 如果要排序的东西是java自己的类,如Integer,直接在传参的时候传入一个比较器;传入null的话默认升序排列
ArrayList<Integer> a=new ArrayList<>();
a.add(4);
a.add(5);
a.add(1);
a.sort(new Comparator<Integer>() {
	@Override
	public int compare(Integer o1, Integer o2) {
		return o2-o1;
	}
});
//a.sort(null);
2.2 如果要排序的东西是你自己实现的类,那就在类里面直接重写compareTo方法

不同位数相加时的技巧

假设每次循环返回一个int,第一次返回1,第二次返回2,第三次返回3,最后算法的结果是123,如何计算?

这个 问题看似简单其实有一个问题,就是你并不知道循环的次数是多少,也就是说无法确定1乘以的究竟是10的几次方,下面介绍两种方法:

方法一:

用stack的思想,把每次循环的值都存在stack中,这样以先进后出的性质,最后只需要每次pop出一个值,先乘以1,再依次乘以10,100,1000即可算出123

方法二:

这个方法比较巧妙,就是令val=val*10+x;其中val初始化为0,x为每次循环的值。这样的话就不需要借助额外的存储空间了。


&的妙用

比如下面这段代码,最后的输出是ans,我需要ans随着递归的每一层的进行都改变它的值,而且改变其真正的值,这时候就要在方法实现的时候在ans前面加上&。但是k是一个临时变量,在计算每一条路径时都会有不同的值,我希望递归的每一层都会改变k的值,但是却不影响上一层的递归,即这层递归结束后k还是原来上一层递归的值,这时候再在方法实现的时候就不需要在k之前加&

int minDepth(TreeNode* root) {
        if (!root)
            return 0;
        int ans = INT_MAX;
        int k = 1;
        dfs(root,ans,k);
        return ans;
    }
    void dfs(TreeNode* root, int &ans, int k) {
        if (root->left == NULL && root->right == NULL) {
            ans = min(k,ans);
            return;
        }
        if (root->left || root->right)
            k++;
        if (root->left) 
            dfs(root->left, ans, k);    
        if (root->right) 
            dfs(root->right, ans, k);
    }

字符串倒序

#include<string>
int main()
{
    string str="cvicses";
    string s(str.rbegin(), str.rend());
    cout << s << endl;
    return 0;
}

关注我,了解更多刷题中的小技巧
关注我,了解更多刷题中的小技巧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值