华为机试 (105)

    科技2022-08-01  95

    只出现一次的字符

    找出字符串中第一个只出现一次的字符

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input; while ((input = br.readLine()) != null) { for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (input.indexOf(c) == input.lastIndexOf(c)) { System.out.println(c); break; } if (i == input.length() - 1) { System.out.println(-1); } } } } } #include <iostream> #include <string> using namespace std; int main(){ string s; while(cin >> s){ bool res=1; int a[26]={0};//创建一个长度26的数组,对应26个字母 for(int i=0;i<s.size();i++) a[s[i]-'a']++;//对输入的字符串的字母计数 for(int i=0;i<s.size();i++) if(a[s[i]-'a']==1){ cout << s[i] << endl; res=0; break; } if(res) cout << -1 << endl; } return 0; }

    查找组成一个偶数最接近的两个素数

    任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对

    在这里插入代码片 #include<iostream> #include<cmath> #include<algorithm> using namespace std; bool isPrime(int n){ for(int i=2;i*i<=n;i++){ if(n%i==0){return false;} } return true; } int main(){ int n; while(cin>>n){ for(int i=n/2;i>1;i--){ if(isPrime(i)&&isPrime(n-i)){ cout<<i<<endl; cout<<n-i<<endl; break; } } } return 0; }

    DNA序列

    一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。 给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。 输入描述: 输入一个string型基因序列,和int型子串的长度 输出描述: 找出GC比例最高的子串,如果有多个输出第一个的子串

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String in = ""; while ((in = br.readLine()) != null) { int window = Integer.parseInt(br.readLine()); int num = 0; for(int i = 0; i < in.length(); i++) { char cur = in.charAt(i); if(i == 'G' || i == 'C') num++; } int max = num; int left = 0; for(int i = 1; i < in.length() - window; i++) { char pre = in.charAt(i - 1); char nex = in.charAt(i + window - 1); if(pre == 'G' || pre == 'C') num--; if(nex == 'G' || nex == 'C') num++; if(num > max) { max = num; left = i; } } System.out.println(in.substring(left, left + window)); } } } #include <stdio.h> #include <string.h> int main(void){ char str[1000] = {0}; while(scanf("%s", str) !=EOF){ int n; scanf("%d", &n); int a[1000] = {0}; int i, j, max = 0, maxIndex, count =0; int len = strlen(str); for(i=0; i<len-n; i++){ for(j=i; j<i+n; j++){ if(str[j]=='G' || str[j]=='C') count++; } a[i] = count; count = 0; if(a[i] > max){ max = a[i]; maxIndex=i; } } for(i=maxIndex;i<maxIndex+n;i++) printf("%c",str[i]); printf("\n"); return 0; } }

    MP3光标位置

    MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。 现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下: 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。 光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。 其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。 2. 歌曲总数大于4的时候(以一共有10首歌为例): 特殊翻页:屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。 一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。 其他情况,不用翻页,只是挪动光标就行。

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // Scanner sc = new Scanner(System.in); String str = null; while ((str = br.readLine()) != null) { String str2 = br.readLine(); int num = Integer.parseInt(str); char[] array = str2.toCharArray(); int current = 1; int start = 1; for (char one : array) { if (num <= 4) { if(one == 'U') { if(current == 1) { current = num; }else { current--; } } else if(one == 'D') { if(current == num) { current = 1; }else { current++; } } } if(num > 4) { if(one == 'U') { if(current == 1) { current = num; start = num-3; }else if(current == start) { current--; start--; }else { current--; } }else if(one == 'D') { if(current == num) { current = 1; start = 1; }else if(current == start+3) { current++; start++; }else { current++; } } } } StringBuilder sb = new StringBuilder(); for(int i=1;i<=4;i++) { if(num >=i) { sb.append(start + i -1).append(" "); } } System.out.println(sb.toString().trim()); System.out.println(current); } } } #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int n; while(scanf("%d", &n)!=EOF) { char s[1000]; scanf("%s", s); int m=0, start=0, l=strlen(s); if(n<=4) { for(int i=0;i<l;i++) { switch(s[i]) { case 'U': m=(m+n-1)%n; break; case 'D': m=(m+1)%n; break; default: break; } } for(int i=0;i<n;i++) { if(i!=0) { printf(" "); } printf("%d", i+1); } printf("\n%d\n", m+1); } else { for(int i=0;i<l;i++) { switch(s[i]) { case 'U': m--; if(m<0) { m=n-1; start=n-4; } else if(m<start){ start--; } break; case 'D': m++; if(m==n) { m=0; start=0; } else if(m==start+4){ start++; } break; default: break; } } for(int i=start;i<start+4;i++) { if(i!=start) { printf(" "); } printf("%d", i+1); } printf("\n%d\n", m+1); } } return 0; }

    查找两个字符串的最长公共子串

    查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。

    import java.io.*; import java.util.*; public class Main{ public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; while((str = br.readLine())!=null){ String ss = br.readLine(); if(str.length()<ss.length()){ System.out.println(res(str,ss)); }else{ System.out.println(res(ss,str)); } } } public static String res(String s,String c){ char[] ch1 = s.toCharArray(); char[] ch2 = c.toCharArray(); int[][] ins = new int[ch1.length + 1][ch2.length + 1]; int max = 0; int start = 0; for (int i = 0; i < ch1.length; i++) { for (int j = 0; j < ch2.length; j++) { if(ch1[i]==ch2[j]){ ins[i+1][j+1] = ins[i][j]+1; if(ins[i+1][j+1]>max){ max = ins[i+1][j+1]; start = i-max; } } } } return s.substring(start+1,start+max+1); } } #include <stdio.h> #include <stdlib.h> #include <string.h> void cal(char* s1,char* s2, int l1){//s1短,s2长 int m = 0; char res[1000] = {0}; for(int i = 0;i<l1;i++){ for(int j = 1;j<=l1-i;j++){ if(j<=m){ continue; } char tmp[1000] = {0}; memcpy(tmp,&s1[i],j);//构建子串 if(strstr(s2,tmp)!=NULL){ m = j; memcpy(res,tmp,j); } else break; } } printf("%s\n",res); } int main(){ char a[1000] = {0}; char b[1000] = {0}; char tmp[1000] = {0}; while(scanf("%s\n%s",a,b)!=EOF){ int len_a = strlen(a); int len_b = strlen(b); if(len_a>len_b){ cal(b,a,len_b); } else{ cal(a,b,len_a); } } return 0; }
    Processed: 0.011, SQL: 8