LeetCode简单算法笔记

1.冒泡排序
对一串数组 [5,2,3,1] 进行从小到大排序
解题1:

   public int[] sortArray(int[] nums) {
    //    Arrays.sort(nums);
    //    return nums;

    //冒泡排序
    //外圈控制比较次数 i= 1,2,3
    //     for (int i = 0; i < nums.length-1; i++)
    //     {
    //         //两个邻近元素比较,当前者大于后者,则调换元素位置
    //         for (int j = 0; j < nums.length-1-i; j++)
    //         {
    //             int index = 0;
    //             if (nums[j] > nums[j + 1])
    //             {
    //                 index = nums[j];
    //                 nums[j] = nums[j + 1];
    //                 nums[j + 1] = index;
    //             }
    //         }

    //     }
    //     return nums;
    // }
    partition(nums,0,nums.length-1);
    return nums;
    }
            //快速排序
        public void partition (int [] nums , int l , int r)
        {
            // 错误,退出
            if(l>=r ) return;
            //i = 最小长度   j = 最大长度
            int i =l , j = r;
            int tmp = nums[l];
            while(l<r)
            {
                while(l<r && nums[r] >= tmp)
                {
                    r--;
                }
                    nums[l] = nums[r];
                
                while(l<r && nums[l]<= tmp)
                {  
                    l++;
                }
                    nums[r] = nums[l];
            }
            nums[l]  = tmp;
            partition(nums,i,l-1);
            partition(nums,l+1,j);
        }

2.整数反转
注意:要考虑整型的区间范围

//  力扣算法 7. 整数反转
  public int reverse(int x) {
        // long result = 0 ;
        // while ( x != 0)
        // {
        //     result = result * 10 + x % 10;
        //     x = x/10; 
        // }
        // if(result> Integer.MAX_VALUE || result< Integer.MIN_VALUE)
        // {
        //     return 0 ; 
        // }
        // return (int) result;

        //官方解答
        
        //当x 处于 Integer.MIN_VALUE  
        if(x == Integer.MIN_VALUE ) return 0;
        //当x 为负数  的情况下
        int neg = x <0 ? -1:1;
        //将负数 先转化为整数
        x *= neg;
        //ret为新数字
        int ret =0 ;
        while(x>0)
        {
            //n为新数字
            int  n = ret ;
            n *= 10;
            n+= x % 10 ;
            x/=10;
            if(n/10!=ret ) return 0;
            ret = n;
        }
        return ret * neg ;
    }

3.两数之和

//  力扣算法 1.两数之和
 public int[] twoSum(int[] nums, int target) {
        
         //创建一个新的数组存起来
        int i ,j ;
        int[] result = new int[2];

        for ( i = 0; i < nums.length; i++)
        {
            for ( j = i+1; j < nums.length; j++)
            {
                if (nums[i] + nums[j] == target)
                {
                    result [0] = i;
                    result [1] = j;
                }
            }
        }
        return result;
    }

4.回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例1 :
输入: 121
输出: true

示例2 :
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

// 力扣算法 9.回文数

    public static boolean isPalindrome(int x) {
        //首先判断它必须>=0
        int k = x;
        if(k<0) return false;
        //新值
        int number = 0;
        while (k > 0)
        {
            number = k % 10 + number * 10;
            k /= 10;
        }
        return ( x== number) ? true : false;
    }
//-------------------------------------------------------------	
		//官方解法
        //考虑 x = 负数 和 x = 10的倍数
        if(x<0 || (x!=0 && x%10 ==0)) return false;
        //定义新值
        int n = 0;
        while (x > n)
        {
            n *= 10;
            n += x % 10;
            x /= 10;
        }
        //这里考虑 1 和 0 的情况
        return  (x==n) || (n/10 ==x) ;

5.最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入: [“flower”,“flow”,“flight”]
输出: “fl”

示例 2:

输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。

//力扣算法 14.最长公共前缀
public static String longestCommonPrefix(String[] strs)
    {
        //判断字符串为空 && null
        if(strs == null || strs.length==0) return "";
        //设置前缀为第一个字符串
        String prefix = strs[0];

        //遍历所有字符串
        for (String s : strs)
        {
            //匹配 如果完全匹配 返回值为0的时候 表示是一个值
            //完全匹配索引不为0 则对prefix进行尾切
            while(s.indexOf(prefix) != 0)
            {
                // 不匹配  切分最长公共前缀
                prefix= prefix.substring(0, prefix.length() - 1);
            }
        }
        return prefix;
     }

6.罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 - 数值
I -------- 1
V ------- 5
X ------ 10
L ------- 50
C ------ 100
D ------ 500
M ----- 1000

//  力扣算法13. 罗马数字转整数
public  static int romanToInt(String s)
    {
        // 定义和数      IV( 1 && 5) ==4
        int sum = 0;
        //定义上一个数 / 当前为个位数时
        int preNum = getValue(s.charAt(0)); // 1
        for (int i = 1; i < s.length(); i++)
        {
            //当前数字
            int num = getValue(s.charAt(i));  //4

            if (num > preNum)
            {
                sum -= preNum;  //sum = 0-1 = -1;
            } else
            {
                sum += preNum;  // sum = 0+1 = 1;
            }
            preNum = num;  //preNum =5
        }
        sum += preNum;  // sum = -1 + 5
        return sum;
    }
    public static int getValue(char ch)
    {
        switch (ch)
        {
            case 'I': return  1;
            case 'V': return  5;
            case 'X': return 10;
            case 'L': return 50;
            case 'C': return 100;
            case 'D': return 500;
            case 'M': return 1000;
            default: return 0;
        }
    }

所有材料及题解来源均出于:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
申明:著作权归领扣网络所有,商业转载请联系官方授权。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值