网易笔试增加一行代码从20%通过到100%通过。



/**
问题描述:输入一个n,返回一个m。
m的条件为:大于n的最小的且2进制下m和n的1个个数相同
不要喷我代码写的烂,谢谢
*/

#include <iostream> using namespace std; int numOfX(long n) { int count = 0; long m = n; while(m) { count++; m=m&(m-1); } return count; } int main() { long n,i,j; int count,sum=1; while(cin>>n) { count = numOfX(n); i = j =n; i = i & (i - 1); //这个i的结果是n最后一个1变0 j = j - i; //j是n和i的差 i = n + j; //幻想n+j就是结果 如果最后不是连续的1,这个就是结果 for(;numOfX(i)!=count;i++); //体验了一行代码从20%到100%
/*
想了想,if(numOfX(i)!=count)这个时候求count-numOfX(i),把这几个1,变成1111,再加上i应该就好了
*/ cout<<i<<endl; } }
下班回来一看已经只有80分钟了,就随便写了下选择题,看了眼问答题(翻译是什么贵,好想来个Google翻译)
来到我热爱的编写代码,时间已经只剩下40分钟
10分钟写了题1


/**
问题描述:输入A B C。输出A B的一个数X
输出满足条件:X的各位之和与C的各位之和的差最小。
用了一个蠢方法,遍历
不过只过了80%的用例
应该是没考虑到:X1,X2的各位之和与C的各位之和相同的时候,输出哪个。不过过了80%对学渣来说已经很满足了
*/
#include <iostream> using namespace std; int sumOfNum(int n) { int count = 0; int m = n; while(m) { count += m % 10; m /= 10; } return count; } int findX(int A, int B, int C) { int min, max, i; int cha,cha2,x; int sumOfC; sumOfC = sumOfNum(C); if(A < B) { min = A; max = B; } else { min = B; max = A; } cha = sumOfNum(min) > sumOfC ? sumOfNum(min) - sumOfC : sumOfC - sumOfNum(min); for(i = min; i <= max; i++) { cha2 = sumOfNum(i) > sumOfC ? sumOfNum(i) - sumOfC : sumOfC - sumOfNum(i); if(cha2 < cha) { cha = cha2; x = i; } } return x; } int main() { int A,B,C; int findX(int A, int B, int C); while(cin>>A>>B>>C) { cout<<findX(A, B, C)<<endl; } return 0; }


看了看时间还有20分钟,题目3不太会解
但是我还是忍不住分享题目3

/**
题目描述:给一个字符串,输出字串中不同的平方字符串的个数
平方字符串的定义:AA aa abcabc ABAB 
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
	char str;
    while(cin>>str)
    {
        int n = rand()%10;
        int i;
        switch(n)
        {
           case 1:
                i = 23;
            	break;
            case 2:
            	i = 22;
            	break;
            case 3:
            	i = 20;
            	break;
            case 4:
            	i = 19;
            	break;
            case 5:
            	i = 14;
            	break;
            case 6:
                i = 12;
            	break;
            case 7:
                i = 4;
            	break;
            case 8:
            	i = 3;
            	break;
        	default :
                i = 8;
            	break;
        }
    	cout<<i<<endl;    
    }
}
写完之后还有5分钟
又想了想正经地写。
还是最蠢的方法遍历,没写完,求AC的大神的代码
内心深处还是想成为一头猪被养


全部评论
先找最右的01,将其变成10,后面的所有1全部移到最右,第二题我是这么写的,AC了。
点赞 回复 分享
发布于 2016-09-23 20:28
对对对,因为下一个数是比该数大且1的个数相同的数,所以就应该是找到第一个 在1出现后的0,并记录这个过程中1的个数;然后把0变为1,把1从后往前放,中间补0,这样就保证了条件。 这么想就是LeetCode上求下一个permutation数
点赞 回复 分享
发布于 2016-09-23 20:31
我可以说我用70分钟做完所有然后ac全部吗?第一次遇到这么顺利的题,第二题二进制1的是程序员面试金典的题,第一题和第三题竟然直接手写没调试即ac 链接:http://www.nowcoder.com/practice/33ad4d168a3247b9b63f41e4eaded652?tpId=8&tqId=11021&rp=2&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking class CloseNumber { public: vector<int> getCloseNumber(int x) { // write code here int i, j; int small, big; for(i = 0; i < 32 && (x & (1 << i)) != 0; ++i) ; if(i > 0) { big = x + (1 << (i - 1)); for(j = i ; j < 32 && (x & (1 << j)) == 0; ++j) ; //small = x - (j << (j - 1)); small = x & ~((1 << (j + 1)) - 1); for(int k = 0; k <= i; ++k) small |= (1 << (j - k - 1)); } else { for( ; i < 32 && (x & (1 << i)) == 0; ++i) ; for(j = i; j < 32 && (x & (1 << j)) != 0; ++j) ; big = x + (1 << i); for(int k = 0; k < j - i - 1; ++k) big |= (1 << k); small = x - (1 << (i - 1)); } return vector<int>({small, big}); } };
点赞 回复 分享
发布于 2016-09-23 21:00
运气好全ac了
点赞 回复 分享
发布于 2016-09-23 23:07
一开始用最笨的方法,求出输入的数有多少个1然后从那个数开始自加,求出同样多1的最近的那个数,结果通过百分之80.。。
点赞 回复 分享
发布于 2016-09-23 20:10
import java.util.Scanner; publicclass Main {     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         while (in.hasNextInt()) {             int n = in.nextInt();             String bin = Integer.toBinaryString(n);             char[] c = bin.toCharArray(); //10进制转为2进制             int first1 = -1;             int first0 = -1;             for(int i=c.length-1,len=c.length;i>=0;i--){             if(c[i]=='1'&&first1==-1){             first1 = i; //找到从右往左的第一个1             }             if(c[i]=='0'&&first1!=-1){             first0 = i; //从第一个1开始出发,找到第一个0             break;             }             }             c[first1] = '0'; //1变0             c[first0] = '1'; //0变1             System.out.println(Integer.parseInt(String.valueOf(c),2));  //2进制转回10进制         }     } }
点赞 回复 分享
发布于 2016-09-23 20:14
第二题A还可能大于B啊T。T,给跪啊
点赞 回复 分享
发布于 2016-09-23 20:34
感觉都是直接遍历都能解出来。 字符串那个两层遍历,第一层是下标从0到最后,第二层是字符串长度从1到size / 2; 然后比较字串的子串是否相等,把相等的字串放到set中。最后打印set的size就行了 string str; unordered_set<string> strSet; cin >> str; for(int pos = 0; pos < str.size(); ++pos) for(int len = 1; len <= str.size() / 2; ++len) { if(str.substr(pos, len) == str.substr(pos + len, len)) { strSet.insert(str.substr(pos, len)); } } cout << strSet.size() << endl;
点赞 回复 分享
发布于 2016-09-23 21:38

相关推荐

09-05 13:11
已编辑
东华理工大学 前端工程师
阿米诺斯look:完蛋,我被美女包围了😆
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务