nowcoder-oj【面试高频TOP榜单-入门难度】

1 NC65 斐波那契数列

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
public class Solution {
    public int Fibonacci(int n) {
        
        //自己首次实现
        /*
        if(n==0){
            return 0;
        }else if(n==1){
            return 1;
        }else{
            return Fibonacci(n-2) + Fibonacci(n-1);
        }
        */
        
        //参考1
        /*
        if(n<=1){
            return n;
        }else{
            return Fibonacci(n-1) + Fibonacci(n-2);
        }
        */
        
        //参考2
        /*
        int[] ans = new int[40];
        ans[0] = 0;
        ans[1] = 1;
        for(int i=2; i<=n; i++){
            ans[i] = ans[i-1] + ans[i-2];
        }
        return ans[n];
        */
        
        //参考3
        if(n <= 1){
            return n;
        }else{
            int sum = 0;
            int two = 0;
            int one = 1;
            for(int i=2; i<=n; i++){
                sum = two + one;
                two = one;
                one = sum;
            }
            return sum;
        }
           
           
    }
}
View Code

 

2 NC103 反转字符串

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;


public class Solution {
    /**
     * 反转字符串
     * @param str string字符串 
     * @return string字符串
     */
    public String solve (String str) {
        // write code here
        
        //解法1:SB
        //return new StringBuilder(str).reverse().toString();
         
        //解法2:双指针
        //把字符串转化为数组,使用两个指针,一个在最前面一个在最后面,两个指针指向的值相互交换,交换完之后两个指针在分别往中间走……,重复上面的过程,直到两指针相遇为止
        /*
        char[] charArr = str.toCharArray();
        int left = 0;
        int right = str.length()-1;
        while(left < right){
            char temp = charArr[left];
            charArr[left] = charArr[right];
            charArr[right] = temp;
            left++;
            right--;
        }
        return new String(charArr);
        */
        
        //解法3:单指针
        //使用一个指针,从后往前不断的把字符串的字符放到一个数组中,最后再把数组转化为字符串
        char[] chars = str.toCharArray();
        int length = str.length();
        for (int i = 0; i < length; i++)
            chars[i] = str.charAt(length - 1 - i);
        return new String(chars);
    }
}
View Code

 

3 NC38 螺旋矩阵

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;
public class Solution {
    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        
        //按照从左到右、从上到下、从右到左、从下到上的顺序依此遍历
        
        ArrayList<Integer> list = new ArrayList<>();

        if(matrix.length == 0) {
            return list;
        }

        int left = 0; 
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1; 


        while(true) {
            for(int i = left; i <= right; i++) {  //从左到右
               list.add(matrix[top][i]) ; 
            }

            if(++top > bottom){ //判断是否还有下一行
                break;
            } 
            for(int i = top; i <= bottom; i++){
                 list.add( matrix[i][right]);    //从上到下
            } 

            if(left > --right){ //判断是否还有前一列
                break;
            } 
            for(int i = right; i >= left; i--){
                  list.add(matrix[bottom][i]); //从右到左
            } 

            if(top > --bottom){ //判断是否还有上一行
                break;
            }
            for(int i = bottom; i >= top; i--){
                 list.add(matrix[i][left]);   //从下到上
            } 

            if(++left > right){ //判断是都还有下一列
               break;
            } 
        }
        return list;
        
    }
}
View Code

 

4 NC141 判断回文

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param str string字符串 待判断的字符串
     * @return bool布尔型
     */
    public boolean judge (String str) {
        // write code here
        
        //自己的首次解法
        /*
        char[] charArr = str.toCharArray();
        int begin = 0;
        int end = str.length()-1;
        while(begin < end){
            if(charArr[begin] != charArr[end]){
                return false;
            }
            begin++;
            end--;
        }
        return true;
        */
        
        //参考1:双指针解法
        /*
        if(str==null || str.length()==0){
            return false;
        }
        for(int i=0, j=str.length()-1; i<j; i++, j--){
            if(str.charAt(i) != str.charAt(j)){
                return false;
            }
        }
        return true;
        */
        
        //参考2:SB解法
        //return new StringBuilder(str).reverse().toString().equals(str);
        
        //参考3
        int max_index = str.length() - 1;
        if (max_index == 0) {
            return true;
        }
        int loop = max_index / 2;
        for (int i=0; i<loop; ++i) {
            if (str.charAt(i) != str.charAt(max_index-i)) {
                return false;
            }
            if (i==(max_index-i) || (max_index-i-i)==1) {
                break;
            }
        }
        return true;
        
    }
}
View Code

 

5 NC101 缺失数字

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 找缺失数字
     * @param a int整型一维数组 给定的数字串
     * @return int整型
     */
    public int solve (int[] a) {
        // write code here
        
        //自己首次实现
        /*
        for(int i=1; i<a.length; i++){
            if(a[i-1]+1 != a[i]){
                return a[i-1]+1;
            }
        }
        if(a[0] == 0){
            return a[a.length-1]+1;
        }else{
            return 0;
        }
        */
        
        //参考1:等差数列求和
        //如果不缺那个数字的话, 这个数组的所有数字可以组成一个等差数列, 我们只需要根据公式求和, 然后再减去数组中所有的数字即可
        /*
        int length = a.length;
        int sum = (0+length) * (length+1) / 2;
        for(int i=0; i<length; i++){
            sum -= a[i];
        }
        return sum;
        */
        
        //参考2:暴力求解
        //题中说了是递增排序数组, 所以我们只需要从前往后逐个遍历, 少了哪个就返回哪个
        /*
        int length = a.length;
        for(int i=0; i<length; i++){
            if(a[i] != i){
                return i;
            }
        }
        return length;
        */
        
        //参考3:二分查找法
        /*
        int start = 0;
        int end = a.length - 1;
        while (start <= end) {
            int mid = start + (end - start) / 2;
            if (a[mid] == mid) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return start;
        */
        
        //参考4:位运算-异或
        int xor = 0;
        for (int i = 0; i < a.length; i++){
            xor ^= a[i] ^ (i + 1);   
        }
        return xor;
        
        
    }
}
View Code

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 nowcoder-oj【面试高频TOP榜单-入门难度】

 

 nowcoder-oj【面试高频TOP榜单-入门难度】

 

 nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

6 NC107 寻找峰值

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;


public class Solution {
    /**
     * 寻找最后的山峰
     * @param a int整型一维数组 
     * @return int整型
     */
    public int solve (int[] a) {
        // write code here
        
        //自己首次实现
        
        int length = a.length;
        int index = 0;
        for(int i=1; i<length-1; i++){
            if( (a[i]>a[i-1]) && (a[i]>a[i+1]) ){
                if(i > index){
                    index = i;
                }
            }
        }
        if(a[length-1] > a[length-2]){
            index = length - 1;
        }
        return index;

    }
}
View Code

 

7 NC110 旋转数组

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;


public class Solution {
    /**
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型一维数组 给定数组
     * @return int整型一维数组
     */
    public int[] solve (int n, int m, int[] a) {
        // write code here
        
        //自己首次实现(无通用性,仅适用实例1)
        /*
        if(m > n){
            m = m%n;
        }
        for(int i=m; i>0; i--){
            int temp = a[m-i];
            a[m-i] = a[n-i];
            a[n-i] = temp;
        }
        for(int i=m; i>0; i--){
            int temp = a[m-i+m];
            a[m-i+m] = a[n-i];
            a[n-i] = temp;
        }
        return a;
        */
        
        //参考:三次交换
        //将数组的元素向右移动m次后,尾部 m mod n 个元素会移动至数组头部,其余元素向后移动 m mod n 个位置
        m = m%n;
        reverse(a, 0, n-1); //可以先将所有元素翻转,这样尾部的 m mod n 个元素就被移至数组头部
        reverse(a, 0, m-1); //然后再翻转 [0,m mod n−1] 区间的元素
        reverse(a, m, n-1); //最后翻转[m mod n,n−1] 区间的元素即能得到最后的答案
        return a;
    }
    
    public void reverse(int[] nums, int start, int end){
        while(start < end){
            swap(nums, start++, end--);
        }
    }
    public void swap(int[] nums, int a, int b){
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }
    
}
View Code

 

8 NC151 最大公约数

nowcoder-oj【面试高频TOP榜单-入门难度】

 

 

nowcoder-oj【面试高频TOP榜单-入门难度】
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 求出a、b的最大公约数。
     * @param a int 
     * @param b int 
     * @return int
     */
    public int gcd (int a, int b) {
        // write code here
        
        //自己首次实现
        /*
        if(a == b){
            return a;
        }
        int small = a>b?b:a;
        int max = 1;
        for(int i=1; i<=small; i++){
            if( (a%i==0) && (b%i==0) ){
                if(max < i){
                    max = i;
                }
            }
        }
        return max;
        */
        
        //参考1:辗转相除法,又称欧几里得算法
        /* 
        例子
            假如需要求 434 和 652 的最大公约数,用欧几里得算法,是这样进行的:
                434 / 652 = 0 (余 434)
                652 / 434 = 1(余218)
                434 / 218 = 216(余2)
                216 / 2 = 108 (余0)
            以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,
            所以就得出了 434 和 652 的最大公约数 2。
        */
        /*
        if(a%b == 0){
            return b;
        }else{
            return gcd(b, a%b); //递归
        }
        */
        
        //参考2:暴力
        //找出两个数a,b的最大公约数,暴力遍历,首先找出a与b中的最小值,
        //然后从最小值开始往下遍历,找到的第一个公约数即为最大公约数。1一定是a与b的公约数。
        int min = Math.min(a, b);
        while(min > 0){
            if(a%min==0 && b%min==0){
                return min;
            }
            --min;
        }
        return 1;
        
    }
}
View Code

 

上一篇:链表OJ题之——合并有序链表


下一篇:数组OJ题