9-5搜狗后端

1.第一题是numberofprize(),意思是a,b,c三个数, 2个a可以转b或c, a和 b也可以转 c,a,b换一个礼物,问最多转多少礼物
public static int numberofprize (int a, int b, int c) {
// write code here
List list = new ArrayList<>();
list.add(a);
list.add(b);
list.add©;
Collections.sort(list);
int max = list.get(2);
int med = list.get(1);
int min = list.get(0);
if(max - med >= (med - min) 2){
max -= 2 * (med - min);
int temp = Math.max((max - med) / 5,0);
return temp + med;
}else{
min = (max - med) / 2 + min;
return (min + med) / 2;
}
}
2.盖房子,给房子位置和宽度问多少种方法
public static int getHouses(int t, int[] xa) {
// write code here
int n = 0;
if (xa == null || xa.length == 0) return n;
for (int i = 0; i < xa.length-2; i += 2){
int dis1 = xa[i+2] - xa[i];
double dis2 = dis1 - 0.5
(xa[i+3] + xa[i+1]);
if (dis2 > (double) t) n += 2;
if (dis2 == (double) t) n++;
}
return n+2;
}

3.构造密码什么的,给初始密码,自己从0-9写第一个数字,然后这个数字和初始密码第2个求平均值,可以向上或者向下取值,问最后多少种(不包括初始密码)
public class Solution {
static boolean flag;
public static long dfs(String password,String cur,int num,int d,int n){
cur+=num;
if(d==n){
if(cur.equals(password)) flag = true;
return 1;
}
int curNum = password.charAt(d)-‘0’;
int sum = curNum+num;
if((sum&1)==0){
return dfs(password,cur,sum/2,d+1,n);
}else{
return dfs(password,cur,sum/2,d+1,n) + dfs(password,cur,sum/2+1,d+1,n);
}
}
public static long getPasswordCount1(String password){
long res = 0;
flag = false;
for(int i=0;i<10;i++){
res+=dfs(password,"",i,1,password.length());
}
return flag?res-1:res;
}
}

  1. 记忆化搜索
    public class Solution {
    static long[][] dp;
    //记忆化搜索
    public static long dfs(String password,int num,int d,int n){
    if(d==n) return 1;
    if(dp[d][num]!=0) return dp[d][num];
    int curNum = password.charAt(d)-‘0’;
    int sum = curNum+num;
    if((sum&1)==0){
    return dp[d][num] = dfs(password,sum/2,d+1,n);
    }else{
    return dp[d][num] = dfs(password,sum/2,d+1,n) + dfs(password,sum/2+1,d+1,n);
    }
    }
    public static long getPasswordCount(String password){
    dp = new long[password.length()][10];
    long res = 0;
    for(int i=0;i<10;i++){
    res+=dfs(password,i,1,password.length());
    }
    // 只有相邻两位相差<=1才有可能生成和初始串相同的串,否则不可能
    for(int i=1;i<password.length();i++){
    // 差>1,直接返回res
    if(Math.abs(password.charAt(i)-password.charAt(i-1))>1) return res;
    }
    // 说明存在重复
    return res-1;
    }
    }

  2. 验证程序,随机生成数字字符串,两者输出结果全部相同说明正确

import java.util.Random;

public class mima {
static long[][] dp;
//记忆化搜索
public static long dfs(String password,int num,int d,int n){
if(d==n) return 1;
if(dp[d][num]!=0) return dp[d][num];
int curNum = password.charAt(d)-‘0’;
int sum = curNum+num;
if((sum&1)0){
return dp[d][num] = dfs(password,sum/2,d+1,n);
}else{
return dp[d][num] = dfs(password,sum/2,d+1,n) + dfs(password,sum/2+1,d+1,n);
}
}
public static long getPasswordCount(String password){
dp = new long[password.length()][10];
long res = 0;
for(int i=0;i<10;i++){
res+=dfs(password,i,1,password.length());
}
// 只有相邻两位相差<=1才有可能生成和初始串相同的串,否则不可能
for(int i=1;i<password.length();i++){
// 差>1,直接返回res
if(Math.abs(password.charAt(i)-password.charAt(i-1))>1) return res;
}
// 说明存在重复
return res-1;
}
// 暴力dfs
public static long dfs1(String password,int num,int d,int n){
if(d
n) return 1;
int curNum = password.charAt(d)-‘0’;
int sum = curNum+num;
if((sum&1)==0){
return dfs1(password,sum/2,d+1,n);
}else{
return dfs1(password,sum/2,d+1,n) + dfs1(password,sum/2+1,d+1,n);
}
}
public static long getPasswordCount1(String password){
long res = 0;
for(int i=0;i<10;i++){
res+=dfs1(password,i,1,password.length());
}
// 只有相邻两位相差<=1才有可能生成和初始串相同的串,否则不可能
for(int i=1;i<password.length();i++){
// 差>1,直接返回res
if(Math.abs(password.charAt(i)-password.charAt(i-1))>1) return res;
}
// 说明存在重复
return res-1;
}
public static void main(String[] args) {
Random r = new Random(1);
int len = 10;
String[] passwordList = new String[len];
for(int i=0;i<len;i++){
StringBuilder password = new StringBuilder();
for(int j=0;j<30;j++){
password.append(Math.abs(r.nextInt())%10);
}
passwordList[i] = password.toString();
}
long[] res1 = new long[len];
long[] res2 = new long[len];
long start1 = System.currentTimeMillis();
for(int i=0;i<len;i++){
res1[i] = getPasswordCount(passwordList[i]);
}
long end1 = System.currentTimeMillis();
System.out.println(“记忆化搜索运行时间为:”+(end1-start1)+“ms”);
for(int i=0;i<len;i++){
res2[i] = getPasswordCount1(passwordList[i]);
}
System.out.println(“暴力运行时间为:”+(System.currentTimeMillis()-end1)+“ms”);
boolean isSame = true;
for(int i=0;i<len;i++){
if(res1[i]!=res2[i]){
System.out.println(“数据:” + passwordList[i] + “两者结果不一致”);
isSame = false;
}
}
if(isSame) System.out.println(“结果一致”);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 搜狗输入法是一款常见的中文输入法,它在ubuntu20系统上的候选项数量是可调节的,不仅仅限定为5个。用户可以根据个人的需要和偏好进行配置。 1. 在ubuntu20系统下,打开搜狗输入法设置面板,一般可以通过点击任务栏上的输入法图标,选择“设置”或“选项”进入设置界面。 2. 在设置界面中,可以找到候选项相关的选项。这个选项通常称为“候选数量”、“候选栏目个数”或类似的名称。 3. 点击该选项后,可以输入想要设置的候选项数量,可以根据个人的喜好选择合适的数值。一般情况下,支持的候选项数量是有限的,但具体数值可以根据输入法的版本和设置面板的设计而有所不同。 4. 设置完成后,点击确认或应用按钮,保存设置。 5. 在使用搜狗输入法时,当输入一个字或词语后,会在输入框的附近弹出候选项列表。根据之前设置的候选项数量,可以同时显示多个候选项,达到更准确、更快速地选择所需文字的目的。 需要注意的是,对于某些特殊版本的搜狗输入法,可能在ubuntu20系统上存在一些特定的限制,如固定候选项数量为5个。在这种情况下,用户可以尝试升级或更换输入法版本,或者查找相关的补丁和插件来解决该问题。 ### 回答2: 搜狗输入法在Ubuntu 20上默认只显示5个候选项。这个数量是由搜狗输入法开发者在设计时设定的,可能是根据用户体验和使用习惯来考虑的。 一方面,搜狗输入法在候选项上显示较少的数量可以减少屏幕上的信息量,使用户更加集中注意力选择正确的词语,避免信息过载的情况发生。 另一方面,较少的候选项数量也可以提高输入法的响应速度,减少搜索和显示候选项所需要的计算和操作时间。这在大规模数据的搜索和处理中是非常重要的,尤其在硬件资源有限的设备上,如一些低配的电脑或移动设备。 不过,如果你需要显示更多的候选项,也可以通过设置进行调整。具体的调整方法可能因输入法版本和配置而有所不同,建议查阅搜狗输入法的相关文档或官方支持渠道获取更详细的信息。 总之,搜狗输入法在Ubuntu 20上只显示5个候选项可能是为了平衡用户体验和系统资源的考虑,但也可以根据个人需求进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值