2019互联网笔试题编程答案部分

给定有个数组找到数组最长子串 最多可以改变一个数字 例如 输入 3个数 7 1 9  输出 3

思路 分别用两个数组记录以i开始pre和结尾next的递增子串的长度 找到最大的 如果相差一个的话可以加上

def handle():
 n = input()
 n = int(n)
 nums = [int(num) for num in input().split(" ")]
 if n < 3:
  return n
 _pre = [1] * n
 _next = [1] * n
 for i in range(1, n):
  if nums[i] > nums[i-1]:
   _pre[i] = _pre[i-1] + 1
 for i in range(n-2, -1, -1):
  if nums[i+1] > nums[i]:
   _next[i] = _next[i+1] + 1
 ans = 1
 for i in range(1, n-1):
  ans = max(ans, _pre[i], _next[i])
  if nums[i+1] - nums[i-1] >= 2:
   ans = max(ans, _pre[i-1] + _next[i+1] + 1)
 return ans

print(handle())

顺时针打印M*n的矩阵的数字 用空格隔开,

输入如

3

3

1 2 3 4 5 6 7 8 9

 

static int[] spiralOrder(int[][] arr) {
        int [] res = new int[arr.length*arr[0].length];
        int count = 0;
        if(arr == null || arr.length == 0)
            return null;
        int startX = 0, startY = 0;
        int endX = arr[0].length - startX - 1, endY = arr.length - startY - 1;
        while(startX * 2 < arr[0].length && startY * 2 < arr.length) {
           for(int i = startX; i <= endX; ++i) {
               res[count++] = arr[startY][i];
           }
           if(startY < endY) {
              for(int i = startY + 1; i <=endY; ++i) {
                 res[count++] = arr[i][endX];
              }
           }  
           if(startX < endX && startY < endY) {
               for(int i = endX - 1; i >= startX; --i) {
                  res[count++] = arr[endY][i];
               }
           }
           if(endY > (startY + 1) && startX < endX) {
               for(int i = endY - 1; i > startY; --i) {
                   res[count++] = arr[i][startX];
               }
           }
          startX++;
          startY++;
          endX--;
          endY--;
       }
       return res;
    }

Java replace 源码

    public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) 
        {
            int len = value.length;//value就是一个数组,这里得到string字符串的长度
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len)      //先确保字符串中有旧的字符
            {
                if (val[i] == oldChar) 
                {break;}
            }

            if (i < len) 
            {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) 
                {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                return new String(buf, true);
            }
        }
        return this;
    }

阿里

 

import java.util.Scanner;

public class Main{
    public static void main(String args[])
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int result=getResult(n-1,n)+getResult(n-2,n)+getResult(n-3,n);
        System.out.println(result);
    }
    public static int getResult(int n,int m)
    {
        if(n==0) return 1;
        if(n==1 || n==2) return 1;
        if(n==m-1)
        {
            return getResult(n-2,n)+getResult(n-3,n);
        }
        else
        {
            return getResult(n-1,n)+getResult(n-2,n)+getResult(n-3,n);
        }
    }
}

网易有道

1-n栋房子标号相差1 为相邻,k栋房子已经有住户,你需要所住的房子两边都有住户,求最小的可能符合的和最大符合房子数

###---最小为0 #-#-# -最大为2

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for(int i = 0; i < t; i++) {
            int min = 0, max;
            int n = in.nextInt();
            int k = in.nextInt();
            if(n % 2 == 0) {
                if(k > n / 2) {
                    max = n - k;
                } else {
                    max = k - 1;
                }
            } else {
                if(k > n / 2 + 1) {
                    max = n - k;
                } else {
                    max = k - 1;
                }
            }
            if(n < 3) {
                max = 0;
            }
            if(max < 0) {
                max = 0;
            }
            System.out.println(min + " " + max);
        }
    }
}

头条第三次笔试

1,给定字符串输出字符串中不重复的最长子串的长度 例如:输入‘acddw’ 输出3  输入‘bbbb’ 输出 1

思路:两层循环,从头开始遍历,如果没有重复则用temp不断添加记录不重复的子串,有重复则立即停止,子串放到res_list,最后排序得到最长子串。

def solution(one_str):
    res_list=[]
    length=len(one_str)
    for i in range(length):
        tmp=one_str[i]
        for j in range(i+1, length):
            if one_str[j] not in tmp:
                tmp+=one_str[j]
            else:
                break
        res_list.append(tmp)
    res_list.sort(lambda x,y:cmp(len(x),len(y)))
    return res_list[-1]
ss=solution(s)
print len(ss)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值