牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。
操作共有三种,如下:
1.在当前数字的基础上加一,如:4转化为5
2.在当前数字的基础上减一,如:4转化为3
3.将当前数字变成它的平方,如:4转化为16
返回最少需要的操作数。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * @param n int整型 表示牛牛的数字 * @param m int整型 表示牛妹的数字 * @return int整型 */ int solve(int n, int m) { // write code here //BFS的解法 queue<int> que; int hased[2000]; //打表是不是已经存在了,(超过两千这个数字就已经没有意义了) int que_length = 0; int temp_num = 0; int step = 0; memset(hased, 0, sizeof(int)*2000); //全部置零 que.push(n); hased[n] = 1; while (!que.empty()) { que_length = que.size(); for (int i = 0; i < que_length; i++) { temp_num = que.front(); que.pop(); if (temp_num == m) return step; if (temp_num > 1 && hased[temp_num - 1] == 0) //当前数字为1而且没有进入过 { que.push(temp_num - 1); hased[temp_num - 1] = 1; } if (temp_num < m && hased[temp_num + 1] == 0) //当前数字小于m,而且没有进入过 { que.push(temp_num + 1); hased[temp_num + 1] = 1; } if (temp_num < 45 && hased[temp_num * temp_num] == 0) //当前数字小于45,才有平方的必要性 { que.push(temp_num * temp_num); hased[temp_num * temp_num] = 1; } } step++; } return step; } };
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 表示牛牛的数字 * @param m int整型 表示牛妹的数字 * @return int整型 */ public int solve (int n, int m) { // 处理特殊情况 if(n>=m) return n-m; // 取与m平方根最近的整数 int k=(int)Math.sqrt(m); if(m-k*k>(k+1)*(k+1)-m) k++; // 取m-n与n到k递归步数最小者 return Math.min(m-n,solve(n,k)+1+Math.abs(m-k*k)); }
import java.util.*; public class Solution { public static void main(String[] args) { Solution solution = new Solution (); System.out.println ("请输入牛牛的数字,例如:牛牛-3" ); int n = getInt (); System.out.println ("请输入牛妹的数字,例如:牛妹-10" ); int m = getInt (); solution.solve ( n,m ); } public static void solve (int n, int m) { // write code here int sum = 0; if (n < 2){ n++; sum++; } while (n * n <= m){ sum ++; n = n * n; } if ((n * n + n) / 2 >= m){ sum = sum + m - n; }else { sum = sum + n * n - m + 1; } System.out.println (sum ); } private static int getInt() { Scanner sc = new Scanner(System.in); return sc.nextInt(); } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 表示牛牛的数字 * @param m int整型 表示牛妹的数字 * @return int整型 */ public int solve (int n, int m) { // write code here int x=0; if(n==1 && m!=1){ n++; x++; } List<Integer>l1=new ArrayList<>(); List<Integer>l2=new ArrayList<>(); Set<Integer>set=new HashSet<>(); l1.add(n); while(!l1.contains(m)){ for(int i=0;i<l1.size();i++){ if(l1.get(i)>m){ l2.add(l1.get(i)-1); } else if(l1.get(i)>44){ if(!set.contains(l1.get(i)+1)){ l2.add(l1.get(i)+1); set.add(l1.get(i)+1); } if(!set.contains(l1.get(i)-1)){ l2.add(l1.get(i)-1); set.add(l1.get(i)-1); } } else{ if(!set.contains(l1.get(i)+1)){ l2.add(l1.get(i)+1); set.add(l1.get(i)+1); } if(!set.contains(l1.get(i)-1)){ l2.add(l1.get(i)-1); set.add(l1.get(i)-1); } if(!set.contains(l1.get(i)*l1.get(i))){ l2.add(l1.get(i)*l1.get(i)); set.add(l1.get(i)*l1.get(i)); } } } x++; l1.clear(); l1.addAll(l2); l2.clear(); } return x; } }
//count计数 public int count=0; public int solve (int n, int m) { if(n==1&&n==m) return count-1; if(n>=m) return n-m+count; int sq=(int)Math.sqrt(m); int a=m-sq*sq; //排除掉两数相近的情况 if(Math.abs(m-sq*sq)>Math.abs(m-n)) return count+m-n; //判断加一好还是减一好 if(sq==1||Math.abs(m-(sq+1)*(sq+1))>=Math.abs(m-sq*sq)) { count = count + a + 1; return solve(n, sq); } else { count=count+(sq+1)*(sq+1)-m+1; return solve(n,sq+1); } }